- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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创建原生数组,然后转换对应的ScriptObjectMirror
到 List<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/
我是一名优秀的程序员,十分优秀!