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