はじめに
GroovyでJavaScriptソースをコールしてみる2 の続き。
今回は、以下のようにしてJavaScriptのオブジェクト内に格納されている関数を取り出してみます。
1
| var genzou = {age: 29, sex: 'man', greet: function() { return 'こんにちわ世界'; } };
|
上記の例では、 greet プロパティの関数が今回のターゲットです。
GroovyからJavaScriptをパースして関数プロパティを抜き出してみる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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"]
}
|
実行結果は
1
| sun.org.mozilla.javascript.internal.InterpretedFunction@1549ceb
|
どうやら関数を取得できている模様。
さらに、
の部分を
1
| println obj["greet"].properties
|
とすると、 call メソッドを保持しているので、JavaScriptの関数のように見えます。
多分これで関数の実行ができるのかな。試してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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も見つからず。うーん。
ちなみに
1
2
| def ret = eval("genzou.greet();")
println ret
|
てな感じにすると実行結果( こんにちわ世界 )が正しく取得できます。
ひとこと
リタイヤ・・・JavaScriptの関数は、JavaScriptの構文で呼べっていうことで。ここで時間をとられたら本題のテストができないので終了。