Java 8 将Nashorn JS对象转换为java.util.Map是否有效?
我有java方法Java 8 将Nashorn JS对象转换为java.util.Map是否有效?,java-8,nashorn,Java 8,Nashorn,我有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 met
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将直接接收它们”
我做错了什么?上面说“每个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);
}
}
公共最终类NashornTestMap{
公共静态void main(字符串args[])引发异常{
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine nashorn=factory.getEngineByName(“nashorn”);
纳索恩估价(“)
+“加载(\“nashorn:mozilla\u compat.js\”)
+“导入类(Packages.nashortestmap);”
+“变量映射={};”
+“映射[\'Key\']=字符串(\'Val\”)
+“var test=new nashortestmap();”
+“测试。测试(地图);”
+ "");
}
公共空隙试验(Map obj){
系统输出打印项次(obj);
}
}
上面的代码给出了异常“线程中的异常”main“java.lang.ClassCastException:无法将jdk.nashorn.internal.scripts.JO4转换为java.util.Map”。这证实了这一点
但是,您可以在脚本中使用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);
}
}
公共最终类NashornTestMap{
公共静态void main(字符串args[])引发异常{
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine nashorn=factory.getEngineByName(“nashorn”);
纳索恩估价(“)
+“加载(\“nashorn:mozilla\u compat.js\”)
+“导入类(Packages.nashortestmap);”
+“var HashMap=Java.type(\'Java.util.HashMap\”)
+“var map=new HashMap();”
+map.put(0,\'value1\'”
+“var test=new nashortestmap();”
+“测试。测试(地图);”
+ "");
}
公共空隙试验(Map obj){
系统输出打印项次(obj);
}
}
返回“{0=value1}”同意前面的答案,即您不能像文档中暗示的那样执行此操作。 但是,您可以创建并传递一个映射,如下所示
..
var HashMap = Java.type('java.util.HashMap');
var map = new HashMap();
map.put('1', 'val1');
...someMethod(str, map)
好吧,按照我阅读文档的方式,我会说你没有做错什么。你引用的语句(“每个JavaScript对象也是一个java.util.Map”)似乎是完全错误的,从类JO的继承结构可以看出:jdk.nashorn.internal.scripts.JO扩展了jdk.nashorn.internal.runtime.ScriptObject(实现jdk.nashorn.internal.runtime.PropertyAccess)扩展jdk.nashorn.internal.runtime.PropertyListenerManager(实现jdk.nashorn.internal.runtime.PropertyListener)扩展数组的java.lang.Objector“java.util.ArrayList”。