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/