ScriptEngineManager.getEngineByName查找并为给定的名称创建一个ScriptEngine。
犀牛注册为"js“、" Rhino”、"JavaScript“、"javascript”、"ECMAScript“和"ecmascript”。
Nashorn注册为"nashorn“、"Nashorn”、"js“、"JS”、"JavaScript“、"javascript”、"ECMAScript“和"ecmascript”。
如果我使用Nashorn和Rhino都注册过的"js“这样的名称,那么将使用哪个脚本引擎?它会在Java 8和Rhino上使用Nashorn吗?
发布于 2014-10-27 04:23:49
查看JavaDoc for registerEngineName
注册一个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。如果要通过系统类路径添加一个额外的引擎,那么它将在引导/扩展类加载器加载的引擎之后加载,因此优先。
发布于 2015-03-06 15:01:00
阅读代码时,registerEngineName
确实是确定性的,但是发现机制是一个独立的东西(正如JavaDoc所暗示的),而且它是不确定的,因为它在发现期间将所有引擎添加到HashSet
中,当按名称请求引擎时,它只使用它找到的第一个匹配项。
如果在Java 7中安装ScriptEngine
并以任何常用名称(js
、rhino
等)请求它,您可能会遇到这种情况。
但是,除非您这样做,否则Java 7和Java 8都附带了一个实现,它响应于js
、javascript
、ecmascript
等。只要您不要求rhino
或nashorn
,那么在这两种情况下,它都应该可以工作。
https://stackoverflow.com/questions/26580931
复制相似问题