昼間のメモ

お仕事をしているときに、あっ!と思いついたことはすぐに忘れてしまいますので、とにかく残すためのメモです。

広告

※このエリアは、60日間投稿が無い場合に表示されます。記事を投稿すると、表示されなくなります。

JavaからJavaScriptを呼び出すサンプル

2007-08-06 10:05:04 | Weblog

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

 

ジャンル:
ウェブログ
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加 mixiチェック
« jrunscript(JDK6以降) | トップ | 匿名関数の定義と実行 »

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL