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

How can I pass JavaScript Strings to a Nashorn engine instead of Java Strings?

使用脚本引擎和绑定,它似乎将进入的变量视为 Java 字符串而不是 Java 脚本字符串。这些语言的成员函数具有相同的签名但行为不同,这在编写 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);
    }
}

事实是,在内部,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.