JavaでJavaScriptを実行する

By | 2011年4月28日

JavaSE6の標準機能でJavaScriptを実行させることができる。
それを実現するにはScriptEngineクラスを使う。
JavaScriptの関数をJavaから呼んだり、
JavaのメソッドをJavaScriptから呼んだりすることもできる。

サンプルを以下に示す。

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		ScriptEngineManager sem = new ScriptEngineManager();

		// JavaScriptのScriptEngineを取得する
		ScriptEngine se = sem.getEngineByName("JavaScript");

		if( se == null ){
			System.out.println("JavaScriptはサポート外");
			return;
		}

		/////////////////////////////////////////////////////////
		// JavaScriptを実行
		/////////////////////////////////////////////////////////
		try {
			se.eval("println('Hello world this is js.')");
		} catch (ScriptException e) {
			e.printStackTrace();
		}


		/////////////////////////////////////////////////////////
		// JavaScriptで定義した関数をJavaから呼び出す
		/////////////////////////////////////////////////////////
		try {
			// JavaScriptで関数を定義
			se.eval("function testJs(val){println('testJs called!! value is :' + val);}");

			try {
				// Javaから呼び出す
				((Invocable)se).invokeFunction("testJs", "Hoge");
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}

		} catch (ScriptException e) {
			e.printStackTrace();
		}

		/////////////////////////////////////////////////////////
		// JavaのメソッドをJavaScriptから呼び出す
		/////////////////////////////////////////////////////////
		class MyClass{
			public void doAction(String val){
				System.out.println("doAction called!! value is:" + val);
			}
		}

		se.put("mc", new MyClass() );
		try {
			// Javaのメソッドを呼び出す
			se.eval("mc.doAction('foo!!')");
		} catch (ScriptException e) {
			e.printStackTrace();
		}
	}
}

実行結果は以下のようになる。

Hello world this is js.
testJs called!! value is :Hoge
doAction called!! value is:foo!!

標準機能でこういったことができるので、Javaも捨てたものではないと思った。
なお、この機能をAndroidで使うことはできない。
AndroidではWebViewとかを使うことになるのだろうか・・・?
こちらはまだ未調査である。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です