Я пытаюсь добиться следующего. Приложение Java должно запускать javascript через ScriptEngineManager/ScriptEngine, и 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)
Кто-нибудь знает, как передавать массивы?
Спасибо! С уважением
a
, а не по элементам -for(... in ...)
- это синтаксис для итерации по полям объекта, поэтому, еслиa
действительно является массивом из 3 элементов, вывод будет0\n1\n2\n
независимо от содержимого массива. Синтаксис Javascript для итерации массива —for(... of ...)
. - person Guss   schedule 28.03.2019