我有java方法
void someMethod(String str, Map map) {
...
}
来自JS调用此方法
var map = new Object()
map.key1 = "val1"
...someMethod(str, map)
例外:
java.lang.NoSuchMethodException: None of the fixed arity signatures
[(java.lang.String, java.util.Map)] of method org.prjctor.shell.Bash.eval
match the argument types [java.lang.String, jdk.nashorn.internal.scripts.JO]
但是在Nashorn文档“Java和JavaScript之间的数据类型映射”中说“每个JavaScript对象也是java.util.Map,因此接收地图的API将直接接收它们”。
我做错了什么?
答案 0 :(得分:1)
同意之前的答案,您无法按照文档所暗示的那样执行此操作。 但是,您可以按如下方式创建并传递地图
..
var HashMap = Java.type('java.util.HashMap');
var map = new HashMap();
map.put('1', 'val1');
...someMethod(str, map)
答案 1 :(得分:0)
doc说“”每个JavaScript对象都实现了java.util.Map接口“。但是这个示例测试程序显示的并非如此。
public final class NashornTestMap {
public static void main(String args[]) throws Exception{
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine nashorn = factory.getEngineByName("nashorn");
nashorn.eval(""
+"load(\"nashorn:mozilla_compat.js\");"
+ "importClass(Packages.NashornTestMap);"
+ "var map={};"
+ "map[\"Key\"]=String(\"Val\"); "
+ "var test = new NashornTestMap();"
+ "test.test(map);"
+ "");
}
public void test(Map<String, String> obj){
System.out.println(obj);
}
}
上面的代码给出异常“线程中的异常”main“java.lang.ClassCastException:无法将jdk.nashorn.internal.scripts.JO4强制转换为java.util.Map”。这link证实了这一点。
但是,您可以在脚本中使用Map并直接调用java对象,如下所示。
public final class NashornTestMap {
public static void main(String args[]) throws Exception{
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine nashorn = factory.getEngineByName("nashorn");
nashorn.eval(""
+"load(\"nashorn:mozilla_compat.js\");"
+ "importClass(Packages.NashornTestMap);"
+ "var HashMap = Java.type(\"java.util.HashMap\");"
+ "var map = new HashMap();"
+ "map.put(0, \"value1\");"
+ "var test = new NashornTestMap();"
+ "test.test(map);"
+ "");
}
public void test(Map<String, String> obj){
System.out.println(obj);
}
}
返回“{0 = value1}”