-2

我正在尝试从 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;

4

1 回答 1

0

目前(2018 年 12 月)[]不支持使用访问 Java Map 的值。您需要将映射转换为 aProxyObject才能[]工作。就像你对mapOuter物体所做的那样。

否则,它是一个普通的 Java 映射,您可以调用它.get(key)来获取值。

于 2018-12-20T08:31:02.740 回答