gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:00 26 4
gpt4 key购买 nike

使用 ScriptEngine 和 Bindings,它似乎将输入的变量视为 Java 字符串而不是 JavaScript 字符串。这些语言的成员函数具有相同的签名但行为不同,这在编写 scriptlet 时会造成相当多的困惑。我希望 Java 函数不可用,将绑定(bind)传递为 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.Booleanjava.lang.Integerjava.lang.Double,它们也是 JS 基本类型 booleannumber 的内部表示。)

尽管 --no-java 应该禁用它似乎是合理的。 I filed this as an issue .

关于java - 如何将 JavaScript 字符串而不是 Java 字符串传递给 Nashorn 引擎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com