JavaとJavaScriptは、名前が似てるだけではなく、すごく親和性が高いんです。
JavaからJavaScriptを実行することができるのです。それを使って、JavaでJavaScriptの単体試験などをすることができることは以前の投稿でご紹介しました。
さらにはJavaからJavaScriptのコードのメンバにアクセスすることができます。
JavaからJavaScriptのメンバにアクセスする。
サンプルコードはEclipseのプロジェクトの形式でGithubで公開してあります。
お試しになりたいときは、Eclipseにインポートして、Java8で実行してください。
サンプルコード
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
engine.put("parser", new Main());
engine.eval("function MyJSClass() {"
+ "this.param = \"testParam\";"
+ "this.func=function(){};this.p2=1"
+ "}");
engine.eval("parser.parse(new MyJSClass())");
JavaでJavaScriptを実行するためにはScriptEngineを使います。簡単ですね。
最後の行でJavaScriptからJavaを実行しています。parseメソッドはJavaで作られており、その中でJavaScriptのメンバを取得しています。
//クラス名の取得
Object constructor = scriptObject.getProto().get("constructor");
ScriptFunction scriptFunction = (ScriptFunction) constructor;
System.out.println("className = " + scriptFunction.getName());
//メンバの取得
PropertyMap properties = scriptObject.getMap();
for (Property property : properties.getProperties()) {
String key = property.getKey();
Object obj = scriptObject.get(property.getKey());
System.out.println(" property = " + key + ", arg = " + obj + " (" + obj.getClass() + ")");
}
クラス名の取得の方はちょっとくせがあるので、上記方法を覚えておくと良いです。
もっと良いやり方があれば教えて下さい。
メンバの取得はシンプルですね。
Java8ではNashornというJavaScriptのランタイム実装を使っています。Java7以前はRhinoという別の実装を使っているので。上記とは別になること、ご注意ください。
どんな時に役に立つの?
まずひとつは単体試験に使えます。JavaScriptを別ファイルから読み込んで、クラス定義、メンバがきちんと出来ているかをJavaでテストすることができます。
また、フレームワークの作成に使うことができます。フレームワークとしてどのように使うかは別投稿でご紹介します。