Используя ScriptEngine и Bindings, кажется, что он обрабатывает переменные, входящие в строку Java, вместо строк JavaScript. Языки имеют функции-члены с идентичными сигнатурами, но отличаются поведением, и это создает довольно путаницу при написании сценариев. Я хотел бы, чтобы функции Java не были доступны, передавая привязки, как если бы они были строковыми литералами JavaScript, заставляя использовать только функции JavaScript.Как передать строки JavaScript в движок Nashorn вместо Java Strings?
Я попытался использовать аргумент --no-java, который он принимает, но, похоже, не делает того, что, как я думал. Я также пробовал использовать 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);
}
}
Когда вы используете 'bindings.put', вы выставляете объект Java, который является строкой. Вы считали, что 'jsEngine.eval (" var MyString = \ "Donald Duck \"); ")' – matt