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吗?
答案 0 :(得分:4)
查看registerEngineName
的{{3}}:
注册ScriptEngineFactory以处理语言名称。覆盖 使用Discovery机制找到的任何此类关联。
还有registerEngineName
源代码(注意nameAssociations
是哈希映射):
public void registerEngineName(String name, ScriptEngineFactory factory) {
if (name == null || factory == null) throw new NullPointerException();
nameAssociations.put(name, factory);
}
因此,似乎对于给定名称,getEngineByName
将返回最后为该名称注册的脚本引擎工厂。
当脚本引擎工厂通过JavaDoc机制加载时,加载顺序将取决于相关类加载器枚举服务配置文件的顺序。 ServiceLoader
方法。
对于默认安装,所有这些都无关紧要,因为Java 8仅包含Nashorn,而Java 7及更早版本仅包含Rhino。如果你要通过系统类路径添加一个额外的引擎,它将在bootstrap / extension类加载器加载的引擎之后加载,因此优先。
答案 1 :(得分:0)
读取代码,registerEngineName
确实是确定性的,但是发现机制是一个单独的东西(如JavaDoc所暗示的),并且它是非确定性的,因为它将所有引擎添加到{{1在发现期间,当按名称要求引擎时,它只使用它找到的第一个匹配。
如果您在Java 7中安装an updated Rhino ScriptEngine
并通过任何常用名称(HashSet
,js
等)请求它,则可以遇到此问题。
但除非你这样做,否则Java 7和Java 8都只有一个实现,它可以回答rhino
,js
,javascript
等等。只要你没有&# 39;要求ecmascript
或rhino
,它应该适用于这两种情况。