【发布时间】:2018-10-24 13:45:03
【问题描述】:
我正在努力实现以下目标。 Java 应用程序应该通过 ScriptEngineManager/ScriptEngine 运行 javascript,并且 javascript 应该能够从 Java 应用程序调用函数。只要只传入和传出一个简单的变量,这就会很好。但我无法让它传递数组。 这是我的代码:
private static class test implements Function<Integer[], Integer[]> {
@Override
public Integer[] apply(Integer[] msg) {
for(int i = 0; i < msg.length; i++) System.out.println(msg[i]);
Integer[] a = {1, 2, 3};
return a;
}
}
public static void main(String[] args) throws ScriptException {
String ps = "var e = [0x04, 0x05, 0x06]; var a = send(e); for(i in a) print(i);";
ScriptEngineManager sm = new ScriptEngineManager();
ScriptEngine eng = sm.getEngineByName("JavaScript");
Bindings mbind = eng.createBindings();
mbind.put("send", new test());
eng.setBindings(mbind, ScriptContext.ENGINE_SCOPE);
Object t = eng.eval(ps);
}
我得到错误:
线程 "main" java.lang.ClassCastException 中的异常:jdk.nashorn.api.scripting.ScriptObjectMirror 无法转换为 [Ljava.lang.Integer; 在 scripttest$test.apply(scripttest.java:1) 在 jdk.nashorn.internal.scripts.Script$\^eval_.:program(:1) 在 jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637) 在 jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) 在 jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) 在 jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:446) 在 jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:403) 在 jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399) 在 jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155) 在 javax.script.AbstractScriptEngine.eval(未知来源) 在 scripttest.main(scripttest.java:26)
有人知道如何传递数组吗?
谢谢! 问候
【问题讨论】:
-
请注意,当您的 Javascript 尝试打印结果时,它实际上会遍历
a的字段,而不是成员 -for(... in ...)是遍历对象字段的语法,所以如果a确实是一个 3 成员数组,无论数组的内容如何,输出都是0\n1\n2\n。数组迭代的 Javascript 语法是for(... of ...).
标签: javascript java scriptengine