Java将选择哪个JS脚本引擎?

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吗?

解决方法:

查看JavaDoc for registerEngineName:

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

还有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.如果要通过系统类路径添加其他引擎,它将在引导程序/扩展类加载器加载的引擎之后加载,因此优先.

上一篇:java中的事件循环


下一篇:Java对象可以成为Nashorn中JavaScript对象的原型吗?