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

如何将JavaScript字符串传递给Nashorn引擎而不是Java字符串?,java,nashorn,scriptengine,Java,Nashorn,Scriptengine,通过使用脚本引擎和绑定,它似乎将进入的变量视为Java字符串而不是JavaScript字符串。这些语言具有相同签名但行为不同的成员函数,这在编写scriptlet时会造成相当多的混乱。我希望Java函数不可用,像传递JavaScript字符串文本一样传递绑定,强制只使用JavaScript函数 我尝试过使用--no java参数,它正在接受这个参数,但似乎没有达到我所认为的效果。我还尝试使用类过滤器来完成同样的事情,但没有成功 在下面的示例中,我想获得一个未定义方法的异常(replaceAll仅

通过使用脚本引擎和绑定,它似乎将进入的变量视为Java字符串而不是JavaScript字符串。这些语言具有相同签名但行为不同的成员函数,这在编写scriptlet时会造成相当多的混乱。我希望Java函数不可用,像传递JavaScript字符串文本一样传递绑定,强制只使用JavaScript函数

我尝试过使用--no java参数,它正在接受这个参数,但似乎没有达到我所认为的效果。我还尝试使用类过滤器来完成同样的事情,但没有成功

在下面的示例中,我想获得一个未定义方法的异常(replaceAll仅在Java中,而不是在JavaScript中)。相反,它打印的是库纳尔德·库克

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.Boolean
java.lang.Integer
java.lang.Double
进行相同的处理,它们也是JS基本类型的内部表示形式
Boolean
number


虽然
--没有java
应该禁用此功能,但这似乎是合理的

事实是,在内部,Nashorn使用
java.lang.String
来表示JavaScript原语
String
类型。然而,由于我们认为如果一些人不能在他们身上调用Java
String
方法,他们会感到恼火,所以我们也允许这样做。(对
java.lang.Boolean
java.lang.Integer
java.lang.Double
进行相同的处理,它们也是JS基本类型的内部表示形式
Boolean
number


虽然
--没有java
应该禁用此功能,但这似乎是合理的

这完全回答了我的问题。非常感谢。这完全回答了我的问题。非常感谢。当您使用
bindings.put
时,您将公开一个java对象,它是一个字符串。在使用<代码>绑定时,您是否考虑过代码< >代码> JSnEng.EVE(“var java string=\“唐纳德鸭子”),“?”/<代码>。您是否考虑过,<代码> JSnEng.EVE(“var MyScord= \“唐纳德鸭”);