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とかを使うことになるのだろうか・・・?
こちらはまだ未調査である。