如何将JavaScript字符串传递给Nashorn引擎而不是Java字符串?

时间:2016-05-24 16:43:08

标签: java nashorn scriptengine

使用ScriptEngine和Bindings,它似乎将变量视为Java字符串而不是JavaScript字符串。这些语言具有相同签名但行为不同的成员函数,这在编写scriptlet时会产生一些混乱。我希望Java函数不可用,将绑定作为JavaScript字符串文字传递,强制只使用JavaScript函数。

我尝试过使用它正在接受的--no-java arg,但似乎并没有按照我的想法行事。我也试过使用ClassFilter来完成同样的事情,但没有用。

在下面的示例中,我想获取未定义方法的异常(replaceAll仅在Java中,而不是在JavaScript中)。取而代之的是打印Qonald Quck。

package test;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
import jdk.nashorn.api.scripting.ClassFilter;

public class TestScripting {

    public static void main(String[] args) throws ScriptException {

        System.getProperties().setProperty("nashorn.args", "--no-java");
        NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
        ScriptEngine jsEngine = factory.getScriptEngine(new ClassFilter() {

            @Override
            public boolean exposeToScripts(String arg0) {
                return false;
            }
        });

        Bindings bindings = jsEngine.createBindings();
        bindings.put("MyString", "Donald Duck");

        String res = (String) jsEngine.eval("MyString.replaceAll('D','Q')",
                bindings);
        System.out.println(res);
    }
}

1 个答案:

答案 0 :(得分:0)

事实是,在内部,Nashorn使用java.lang.String来表示JavaScript原始string类型。但是,由于我们认为如果他们无法在其上调用Java String方法会让一些人感到恼火,我们也允许这样做。 (同样的处理方法适用于java.lang.Booleanjava.lang.Integerjava.lang.Double,它们也是JS原始类型booleannumber的内部表示。)

虽然--no-java应禁用此功能,但这似乎是合理的。 I filed this as an issue