首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java将选择哪个JS脚本引擎?

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

Stack Overflow用户
提问于 2014-10-27 03:48:21
回答 2查看 1.4K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-27 04:23:49

查看JavaDoc for registerEngineName

注册一个ScriptEngineFactory来处理语言名称。重写使用发现机制找到的任何此类关联。

并且在registerEngineName源代码中(注意,nameAssociations是一个散列映射):

代码语言:javascript
运行
复制
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。如果要通过系统类路径添加一个额外的引擎,那么它将在引导/扩展类加载器加载的引擎之后加载,因此优先。

票数 4
EN

Stack Overflow用户

发布于 2015-03-06 15:01:00

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

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

但是,除非您这样做,否则Java 7和Java 8都附带了一个实现,它响应于jsjavascriptecmascript等。只要您不要求rhinonashorn,那么在这两种情况下,它都应该可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26580931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档