6

我有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 将直接接收它们”。

我究竟做错了什么?

4

2 回答 2

2

同意先前的答案,因为文档暗示您不能这样做。但是,您可以按如下方式创建和传递地图

..
var HashMap = Java.type('java.util.HashMap');
var map = new HashMap();
map.put('1', 'val1');
...someMethod(str, map)
于 2014-02-01T00:03:34.017 回答
0

文档说“ “每个 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”。这个链接证实了这一点。

但是,您可以在脚本中使用 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}”

于 2013-12-16T05:08:42.797 回答