5

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

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

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

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

4

2 回答 2

4

查看JavaDocregisterEngineName:_

注册 ScriptEngineFactory 以处理语言名称。覆盖使用发现机制找到的任何此类关联。

还有在registerEngineName源代码(注意这nameAssociations是一个哈希映射):

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。如果您要通过系统类路径添加额外的引擎,它将在引导/扩展类加载器加载的引擎之后加载,因此具有优先权。

于 2014-10-27T04:23:49.440 回答
0

阅读代码registerEngineName确实是确定性的,但是发现机制是一个单独的东西(正如 JavaDoc 所暗示的那样),而且它是非确定性的,因为它HashSet在发现期间将所有引擎添加到一个引擎中,并且当通过名称询问引擎时,它只使用它找到的第一个匹配项。

如果您在 Java 7 中安装更新的 RhinoScriptEngine并使用任何常用名称( 、 等)请求它,jsrhino可能会遇到这种情况。

但是除非您这样做,否则 Java 7 和 Java 8 都只有一个实现,它回答js, javascript,ecmascript等。只要您不要求rhinoor nashorn,它应该在这两种情况下都有效。

于 2015-03-06T15:01:00.053 回答