Java 8 Nashorn JavaScript

Java 8 新特性Java 8 の新機能


Nashorn は JavaScript エンジンです。

Nashorn JavaScript Engine は Java 15 では利用できません。

これは Java 11 では既に次のようにマークされています:

@deprecated (forRemoval = true)

JDK 1.8 から、Nashorn は Rhino(JDK 1.6、JDK 1.7) に取って代わり、Java の組み込み JavaScript エンジンになりました。Nashorn は ECMAScript 5.1 仕様といくつかの拡張を完全にサポートしています。JSR 292 に基づく新しい言語機能(JDK 7 で導入された invokedynamic を含む)を使用して、JavaScript を Java バイトコードにコンパイルします。

以前の Rhino 実装と比較して、これにより 2 倍から 10 倍のパフォーマンス向上が実現しました。


jjs

jjs は Nashorn エンジンに基づくコマンドラインツールです。JavaScript ソースコードを引数として受け取り、それらのソースコードを実行します。

例えば、以下の内容を持つ sample.js ファイルを作成します:

print('Hello World!');

コンソールを開き、次のコマンドを入力します:

$ jjs sample.js

上記のプログラムの出力結果は次のとおりです:

Hello World!

jjs 対話型プログラミング

コンソールを開き、次のコマンドを入力します:

$ jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

引数の受け渡し

コンソールを開き、次のコマンドを入力します:

$ jjs -- a b c
jjs> print('字母: ' +arguments.join(", "))
字母: a, b, c
jjs> 

Java から JavaScript を呼び出す

ScriptEngineManager を使用すると、Java 内で JavaScript コードを実行できます。例は次のとおりです:

Java8Tester.java ファイル

import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; public class Java8Tester { public static void main(String args[]){ ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn"); String name = "サンプル"; Integer result = null; try { nashorn.eval("print('" + name + "')"); result = (Integer) nashorn.eval("10 + 2"); }catch(ScriptException e){ System.out.println("スクリプト実行エラー:"+ e.getMessage()); } System.out.println(result.toString()); } }

上記のスクリプトを実行すると、出力結果は次のとおりです:

$ javac Java8Tester.java 
$ java Java8Tester
サンプル
12


JavaScript から Java を呼び出す

次の例は、JavaScript で Java クラスを参照する方法を示しています:

var BigDecimal = Java.type('java.math.BigDecimal');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(
   new BigDecimal(percentage)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}

var result = calculate(568000000000000000023,13.9);
print(result);

jjs コマンドで上記のスクリプトを実行すると、出力結果は次のとおりです:

$ jjs sample.js
78952000000000002017.94

Java 8 新特性Java 8 の新機能

その他の拡張