5

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 を使用しますか?

4

2 に答える 2

4

のJavaDocを見るregisterEngineName

言語名を処理する ScriptEngineFactory を登録します。Discovery メカニズムを使用して見つかったそのような関連付けをオーバーライドします。

また、ソースコードでも(ハッシュマップである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 のみが含まれているため、これらすべてはそれほど重要ではありません。システム クラス パスを介して追加のエンジンを追加する場合は、ブートストラップ/拡張クラス ローダーによってロードされたエンジンの後にロードされるため、優先されます。

于 2014-10-27T04:23:49.440 に答える