GroovyでJavaScriptソースをコールしてみる3

2019-03-21Groovy, JavaScript

はじめに

GroovyでJavaScriptソースをコールしてみる2 の続き。

今回は、以下のようにしてJavaScriptのオブジェクト内に格納されている関数を取り出してみます。

var genzou = {age: 29, sex: 'man', greet: function() { return 'こんにちわ世界'; } };

上記の例では、 greet プロパティの関数が今回のターゲットです。

GroovyからJavaScriptをパースして関数プロパティを抜き出してみる

import javax.script.*;
import sun.org.mozilla.javascript.*;

def engine = new ScriptEngineManager().getEngineByName("JavaScript");

engine.with {
    eval("var genzou = {age:29, sex:'man', greet:function(){ return 'こんにちわ世界'; } };");

    def getClosure = { String key -> delegate.get(key, delegate) }
    sun.org.mozilla.javascript.internal.NativeObject.metaClass.getAt = getClosure

    def obj = eval("genzou")
    // ***何が取れるかな?***
    println obj["greet"]
}

実行結果は

sun.org.mozilla.javascript.internal.InterpretedFunction@1549ceb

どうやら関数を取得できている模様。

さらに、

    println obj["greet"]

の部分を

    println obj["greet"].properties

とすると、 call メソッドを保持しているので、JavaScriptの関数のように見えます。
多分これで関数の実行ができるのかな。試してみます。

import javax.script.*;
import sun.org.mozilla.javascript.*;

def engine = new ScriptEngineManager().getEngineByName("JavaScript");

engine.with {
    eval("var genzou = {age:29, sex:'man', greet:function(){ return 'こんにちわ世界'; } };");

    def getClosure = { String key -> delegate.get(key, delegate) }
    sun.org.mozilla.javascript.internal.NativeObject.metaClass.getAt = getClosure

    def obj = eval("genzou")
    println obj["greet"].call(org.mozilla.javascript.Context.enter(), null, null, [] as Object[])
}

結果、まったく動きません!!(引数にnullを渡しているのは NullPointerException がでる想定で試してみたから。)callメソッドがないといわれます。引数に誤りがあるんだろうけれども、Googleで検索してもjavadocも見つからず。うーん。

ちなみに

def ret = eval("genzou.greet();")
println ret

てな感じにすると実行結果( こんにちわ世界 )が正しく取得できます。

ひとこと

リタイヤ・・・JavaScriptの関数は、JavaScriptの構文で呼べっていうことで。ここで時間をとられたら本題のテストができないので終了。

2019-03-21Groovy, JavaScript