java - Java会选择哪个JS Script Engine?

标签 java rhino nashorn scriptengine

ScriptEngineManager.getEngineByName 查找并为给定名称创建一个 ScriptEngine。

Rhino 将自己注册为“js”、“rhino”、“JavaScript”、“javascript”、“ECMAScript”和“ecmascript”

Nashorn 将自己注册为“nashorn”、“Nashorn”、“js”、“JS”、“JavaScript”、“javascript”、“ECMAScript”和“ecmascript”

如果我使用 Nashorn 和 Rhino 都已注册的名称,如“js”,将使用哪个脚本引擎?它会在 Java 8 上使用 Nashorn,否则会使用 Rhino 吗?

最佳答案

查看 JavaDoc对于 registerEngineName:

Registers a ScriptEngineFactory to handle a language name. Overrides any such association found using the Discovery mechanism.

还有 registerEngineName 源代码(注意 nameAssociations 是一个 HashMap ):

public void registerEngineName(String name, ScriptEngineFactory factory) {
    if (name == null || factory == null) throw new NullPointerException();
        nameAssociations.put(name, factory);
}

因此,似乎对于给定的名称,getEngineByName 将返回最后为该名称注册的脚本引擎工厂。

由于脚本引擎工厂是通过 ServiceLoader 加载的机制,加载顺序将取决于相关类加载器的 getResources 枚举服务配置文件的顺序方法。

对于默认安装,所有这些都无关紧要,因为 Java 8 仅包含 Nashorn,而 Java 7 及更早版本仅包含 Rhino。如果您要通过系统类路径添加一个额外的引擎,它将在 Bootstrap /扩展类加载器加载的引擎之后加载,因此优先。

关于java - Java会选择哪个JS Script Engine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26580931/

相关文章:

javascript - 在 JSObject、AbstractJSObject 中重写 hasMember() 有什么用?

java - 纳肖恩。绑定(bind) native Java 对象?

java - 在 Java 中,像 IntFunction、LongFunction 这样的特殊接口(interface)有什么用?

java - 导出jar项目后如何正确引用文本文件

java - Html 文档中的多行

java - 在字符串上调用替换会抛出 EvaluatorException

javascript - 如何使用 Mozilla Rhino 中文件的重定向输入运行 bash 脚本的 Command()?

json - 使用 Ant 解析和编写 JSON

java - 我如何才能及早访问 Oracle Java 更新,以便在这些更新公开时测试我的 RIA 并避免防火演习?

javascript - 将 toString 方法暴露给 nashorn 中的 js 对象