JDK6よりJavaスクリプトAPIが追加されました(JavaScript APIではない)。
JSR-223に準拠していればjavax.scriptにあるスクリプトAPIを使ってどんなスクリプト言語でも実行できるはずですが、今のところJavaScriptの実装(Rhinoをベースにしたもの)しかないようです。
JavaスクリプトAPIの使い道ですが、エンドユーザにUserExit処理のソースをJavaScriptで記述させ、Java本体から呼び出すみたいなことが可能となります。この場合、自前でスクリプトエンジンを開発する必要がありません。
サンプル
Java スクリプトプログラマーズガイドを読めば使い方は分かります。
テストを兼ねて試してみたのが下のソースです。
import javax.script.*;public class EvalScript {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval("println('Hello JavaScript from Java.')");
engine.eval("var str1 = 'JavaScript String'");
engine.eval("println(str1);");
engine.eval("var str2 = new java.lang.String('Java String');");
engine.eval("println(str2);");
engine.eval("var array = ['JavaScript', 'Array'];");
engine.eval("println(array);");
engine.eval("var list = new java.util.ArrayList();");
engine.eval("list.add('Java');");
engine.eval("list.add('ArrayList');");
engine.eval("println(list);");
engine.eval("var obj = {'JavaScript':'Object'};");
engine.eval("println(obj);");
engine.eval("var map = new java.util.HashMap();");
engine.eval("map.put('Java', 'HashMap');");
engine.eval("println(map);");
Runtime r = Runtime.getRuntime();
engine.put("r", r);
engine.eval("print('Max: ' + r.maxMemory() + ' Bytes\\n');");
engine.eval("print('Total: ' + r.totalMemory() + ' Bytes\\n');");
engine.eval("print('Free: ' + r.freeMemory() + ' Bytes\\n');");
}
}
実行結果は以下の通り。
Hello JavaScript from Java.JavaScript String
Java String
JavaScript,Array
[Java, ArrayList]
[object Object]
{Java=HashMap}
Max: 66650112 Bytes
Total: 5177344 Bytes
Free: 4678440 Bytes
JavaScriptの配列やオブジェクト(ハッシュ)と、JavaのListやMapとで、出力が異なります(おそらくクラス型が異なる)。
engine.put()で、JavaのインスタンスをJavaScriptの変数として受け渡す事ができます。
リンク
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/index.html
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/programmer_guide/index.html









