使用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);
}
}
答案 0 :(得分:0)
事实是,在内部,Nashorn使用java.lang.String
来表示JavaScript原始string
类型。但是,由于我们认为如果他们无法在其上调用Java String
方法会让一些人感到恼火,我们也允许这样做。 (同样的处理方法适用于java.lang.Boolean
,java.lang.Integer
和java.lang.Double
,它们也是JS原始类型boolean
和number
的内部表示。)
虽然--no-java
应禁用此功能,但这似乎是合理的。 I filed this as an issue