如何将JavaScript字符串传递给Nashorn引擎而不是Java字符串?
通过使用脚本引擎和绑定,它似乎将进入的变量视为Java字符串而不是JavaScript字符串。这些语言具有相同签名但行为不同的成员函数,这在编写scriptlet时会造成相当多的混乱。我希望Java函数不可用,像传递JavaScript字符串文本一样传递绑定,强制只使用JavaScript函数 我尝试过使用--no java参数,它正在接受这个参数,但似乎没有达到我所认为的效果。我还尝试使用类过滤器来完成同样的事情,但没有成功 在下面的示例中,我想获得一个未定义方法的异常(replaceAll仅在Java中,而不是在JavaScript中)。相反,它打印的是库纳尔德·库克如何将JavaScript字符串传递给Nashorn引擎而不是Java字符串?,java,nashorn,scriptengine,Java,Nashorn,Scriptengine,通过使用脚本引擎和绑定,它似乎将进入的变量视为Java字符串而不是JavaScript字符串。这些语言具有相同签名但行为不同的成员函数,这在编写scriptlet时会造成相当多的混乱。我希望Java函数不可用,像传递JavaScript字符串文本一样传递绑定,强制只使用JavaScript函数 我尝试过使用--no java参数,它正在接受这个参数,但似乎没有达到我所认为的效果。我还尝试使用类过滤器来完成同样的事情,但没有成功 在下面的示例中,我想获得一个未定义方法的异常(replaceAll仅
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
类型。然而,由于我们认为如果一些人不能在他们身上调用JavaString
方法,他们会感到恼火,所以我们也允许这样做。(对java.lang.Boolean
、java.lang.Integer
和java.lang.Double
进行相同的处理,它们也是JS基本类型的内部表示形式Boolean
和number
)
虽然
--没有java
应该禁用此功能,但这似乎是合理的 事实是,在内部,Nashorn使用java.lang.String
来表示JavaScript原语String
类型。然而,由于我们认为如果一些人不能在他们身上调用JavaString
方法,他们会感到恼火,所以我们也允许这样做。(对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= \“唐纳德鸭”);