如何将 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.Boolean
、java.lang.Integer
和 java.lang.Double
,它们也是 JS 基本类型 boolean
和 number
的内部表示。)
虽然 --no-java
应该禁用它似乎是合理的。 I filed this as an issue.
使用脚本引擎和绑定,它似乎将进入的变量视为 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.Boolean
、java.lang.Integer
和 java.lang.Double
,它们也是 JS 基本类型 boolean
和 number
的内部表示。)
虽然 --no-java
应该禁用它似乎是合理的。 I filed this as an issue.