我正在尝试从 nashorn 迁移到 graalvm (java 11)。我有很多java脚本。
说明 -> 以 maven libs org.graalvm.js: graal-sdk, js, js-scriptengine, org.graalvm.truffle: truffle-api 的形式连接到 java 项目。版本 1.0.0-rc9。
ScriptEngine 创建像 'new ScriptEngineManager().getEngineByName("graal.js")';
然后您可以在地图中的数组中创建地图,例如:
Map mapOuter = new HashMap();
Map mapInner = new HashMap();
List arrayInner = new ArrayList();
mapInner.put("1", 3);
arrayInner.add(mapInner);
mapOuter.put("2", arrayInner);
然后将 mapOuter 转换为 ProxyObject,如 ProxyObject.fromMap(mapOuter);
使用如下代码评估测试 JavaScript:
function test(param) {
print(param["2"]);
param["2"].forEach(function(inArray){
print(inArray);
});
}
这将调用错误,如:
javax.script.ScriptException: org.graalvm.polyglot.PolyglotException: TypeError: INVOKE on foreign object failed 由于:消息不支持:INVOKE
所以问题是:如何让 graalvm 将复杂的 java 对象正确地传递给 javascript 函数?
ps 我在这个例子中想要的是调用对象,如:
打印(参数[“2”][0][“1”]);
它打印了我 3。
我尝试了什么:
尝试将 outerMap 的每个成员解析为 ProxyObject/ProxyArray。
什么工作
如果你改变 javascript 像:
打印(参数["2"][0].get("1"));
它将打印 3;