15
15

More than 5 years have passed since last update.

覚えておくと、いつかあなたの役に立つ、JavaでJavaScriptのコードを解釈する。

Posted at

JavaとJavaScriptは、名前が似てるだけではなく、すごく親和性が高いんです。
JavaからJavaScriptを実行することができるのです。それを使って、JavaでJavaScriptの単体試験などをすることができることは以前の投稿でご紹介しました。
さらにはJavaからJavaScriptのコードのメンバにアクセスすることができます。

JavaからJavaScriptのメンバにアクセスする。

サンプルコードはEclipseのプロジェクトの形式でGithubで公開してあります。
お試しになりたいときは、Eclipseにインポートして、Java8で実行してください。

サンプルコード

JavaScript実行部(抜粋)
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のメンバを取得しています。

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でテストすることができます。
また、フレームワークの作成に使うことができます。フレームワークとしてどのように使うかは別投稿でご紹介します。

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15