Java 8 Nashorn脚本引擎无法将js数组转换为字符串[]
Nashorn脚本引擎在将js数组作为参数传递以调用Java方法时,未能将其转换为字符串[]。有趣的是,它能够在某些情况下成功转换,而在其他情况下失败。是什么导致它在某些情况下工作,但在其他情况下失败 下面给出了一个简单的示例代码片段,以说明什么是有效的,什么是无效的Java 8 Nashorn脚本引擎无法将js数组转换为字符串[],java-8,nashorn,scriptengine,Java 8,Nashorn,Scriptengine,Nashorn脚本引擎在将js数组作为参数传递以调用Java方法时,未能将其转换为字符串[]。有趣的是,它能够在某些情况下成功转换,而在其他情况下失败。是什么导致它在某些情况下工作,但在其他情况下失败 下面给出了一个简单的示例代码片段,以说明什么是有效的,什么是无效的 public class SampleScriptEngine implements Function<String[], String> { public String apply(String... me
public class SampleScriptEngine implements Function<String[], String> {
public String apply(String... message) {
return format("Orders: %s", asList(message));
}
public static void main(String args[]) throws ScriptException {
ScriptEngine scriptEngine = new NashornScriptEngineFactory()
.getScriptEngine(new String[]{"-strict", "--no-java", "--no-syntax-extensions"});
scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("apply", new SampleScriptEngine());
// script evaluation
String object = (String) scriptEngine.eval("apply(['order1', 'order2']);");
System.out.println(object);
}
}
脚本2:
scriptEngine.eval("process(true ? ['order1', 'order2'] : []);");
工作脚本的输出(1和2):
以下两个脚本(3和4)失败
脚本-3:
scriptEngine.eval("var orders = ['order1', 'order2']; process(orders);");
脚本-4:
scriptEngine.eval("var isOk = true; process(isOk ? ['order1', 'order2']: []);");
失败脚本的堆栈跟踪(3和4):
线程“main”java.lang.ClassCastException中的异常:jdk.nashorn.api.scripting.ScriptionObjectMirror不能强制转换为[Ljava.lang.String;
在com.barclays.bidv.temp.research.SampleScriptEngine.apply(SampleScriptEngine.java:13)
在jdk.nashorn.internal.scripts.Script$^eval\:程序(: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(AbstractScriptEngine.java:264)
在com.barclays.bidv.temp.research.SampleScriptEngine.main(SampleScriptEngine.java:24)
进程已完成,退出代码为1
scriptEngine.eval("var orders = ['order1', 'order2']; process(orders);");
scriptEngine.eval("var isOk = true; process(isOk ? ['order1', 'order2']: []);");
Exception in thread "main" java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to [Ljava.lang.String;
at com.barclays.bidv.temp.research.SampleScriptEngine.apply(SampleScriptEngine.java:13)
at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:1)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:446)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:403)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
at com.barclays.bidv.temp.research.SampleScriptEngine.main(SampleScriptEngine.java:24)
Process finished with exit code 1