第7章 Nashorn JavaScript エンジンの活用 : 問題 5 : JavaScript で Java クラスを拡張
問題
以下の JavaScript のコード
var arr = new (Java.extend(java.util.ArrayList)) { add : function(x) { print('Adding ' + x); return Java.super(arr).add(x) } }
により、Java のArrayList
クラスのadd
メソッドをログ出力するように拡張した
しかし、この拡張は単一オブジェクトに対してしか機能しない
ログ出力するArrayList
を何個でも生成できるようにするため、そのようなオブジェクトを生成するファクトリとなる JavaScript 関数を書け
解答
■ JavaScript のコード
function createArray() { var arr = new (Java.extend(java.util.ArrayList)) { add: function(x) { print('Adding ' + x); return Java.super(arr).add(x) } } return arr; }
問題文にあったセンテンスを関数にしただけだが、こんなに簡単でいいのかな…
■ ファクトリ関数の呼び出し
var a = createArray(); a.add('CUB') a.add('子供の白熊') print(a)
上のコードを exercise5.js なるファイルに保存して、Java から呼び出してみる
■ JavaScript を Java で実行
ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("nashorn"); try { Object result = engine.eval(Files.newBufferedReader(Paths.get("exercise5.js"))); System.out.println(result); // result は null } catch (ScriptException | IOException ex) { ex.printStackTrace(); }