【问题标题】:GraalVm - Java complex object can't be parsed like javascript objectGraalVm - Java 复杂对象不能像 javascript 对象一样被解析
【发布时间】:2018-12-18 10:39:30
【问题描述】:

我正在尝试从 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 created like '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 due to: Message not supported: INVOKE

那么问题来了:如何让graalvm正确地将复杂的java对象传递给javascript函数?

附言在这个例子中我想要的是调用像这样的对象:

打印(参数["2"][0]["1"]);

它打印了我 3。

我尝试了什么:
尝试将 outerMap 的每个成员解析为 ProxyObject/ProxyArray。

什么工作 如果您更改 javascript,例如:

print(param["2"][0].get("1"));

它将打印 3;

【问题讨论】:

    标签: javascript java graalvm


    【解决方案1】:

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

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

    【讨论】:

    • 我使用了 ProxyObject,但它不起作用。我也尝试使用 [ProxyObject in ProxyArray in ProxyObject] 构造,但它不起作用。
    • 如果我按照以下要点进行操作,它对我有用:gist.github.com/shelajev/5529229d2913d952529d249251f9abcb。您能否详细说明问题或提供更好的代码示例?
    • 谢谢它的工作,但还有另一个问题->“java.lang.IllegalStateException:线程线程[]请求多线程访问但语言js不允许”这样的错误调用几乎每次运行。有办法解决吗?
    • 在您的示例中,您按原样使用 ArrayList,因此当我尝试使用 javascript 数组 push() 方法时,会导致错误“javax.script.ScriptException: org.graalvm.polyglot. PolyglotException: TypeError: INVOKE on JavaObject (java.util.ArrayList)] 失败,原因是:未知标识符:push"
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多