GroovyでJavaScriptソースをコールしてみる3
はじめに
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の構文で呼べっていうことで。ここで時間をとられたら本題のテストができないので終了。
ディスカッション
コメント一覧
まだ、コメントがありません