Nashorn脚本引擎无法将js-array转换为String []

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
iCMS 回答:Nashorn脚本引擎无法将js-array转换为String []

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1506878.html

大家都在问