gpt4 book ai didi

java - 如何在不使用 "internal"子包中的类的情况下包装到 Nashorn 中的 NativeArray

转载 作者:行者123 更新时间:2023-11-30 02:16:29 26 4
gpt4 key购买 nike

我有一个 Java 数组,例如 Object[] ,我需要传递给JS执行环境,即ScriptEngine .

我不能简单地将它作为一个属性,如下所示:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Object[] array = {1, 2, 3};
engine.put("prop", array);

因为在JS环境中表达式Array.isArray(prop)将被评估为 false ,而我需要它是 true .

jdk.nashorn.internal.objects.NativeArray构造函数已关闭,这意味着您无法实例化 NativeArray明确地。

但是,可以使用 jdk.nashorn.internal.objects.Global.instance().wrapAsObject转换 Java 数组 Object[]NativeArray ,生成的对象将被识别为 JS 数组,即 Array.isArray将为该对象返回 true。

尽管这给出了所需的结果,但使用 internal 中的类package 不是一个好主意,如果您使用的是 Java 9,则更糟糕。

因此,我想知道,假设我无法更改 JS 源,以便该对象被识别为真正的 JS 数组,即 Array.isArray ,是否有更好的方法向 JS 执行环境提供 Java 对象?返回 true?

最佳答案

可以通过javascript创建原生数组,然后转换对应的ScriptObjectMirrorList<Object> ,看起来列表将使用 native 数组作为底层存储:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");     
ScriptObjectMirror jsArray = (ScriptObjectMirror) engine.eval("var arr = []; arr");

@SuppressWarnings("unchecked")
List<Object> ls = jsArray.to(List.class);
ls.add(1);
ls.add(2);
ls.add(3);

System.out.println(ls); // [1, 2, 3]
engine.eval("print(arr)"); // 1,2,3
engine.eval("print(Array.isArray(arr))"); // true

然后您可以在 Java 端使用此列表。

关于java - 如何在不使用 "internal"子包中的类的情况下包装到 Nashorn 中的 NativeArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48226505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com