Nashorn脚本引擎无法将js-array转换为String [],同时将其作为参数传递来调用Java方法。有趣的是,它能够在某些情况下成功转换,而在其他情况下则失败。是什么导致它在某些情况下有效,而在另一些情况下失败?
下面提供了一个简单的示例代码段,以说明哪些有效和哪些无效
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);
}
}
以下两个脚本(1和2)正在工作...
脚本1:
scriptEngine.eval("process(['order1','order2']);")
脚本2:
scriptEngine.eval("process(true ? ['order1','order2'] : []);");
工作脚本(1和2)的输出:
Orders: [order1,order2]
以下两个脚本(3和4)失败了...
脚本3:
scriptEngine.eval("var orders = ['order1','order2']; process(orders);");
脚本4:
scriptEngine.eval("var isOk = true; process(isOk ? ['order1','order2']: []);");
失败脚本的堆栈跟踪(3和4):
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