2008/12/02

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

ゲンゾウ用ポストイット: GroovyでJavaScriptソースをコールしてみる2の続き。

以下のようにして関数を取り出してみる。

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"].properties

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

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の構文で呼べっていうことで。ここで時間をとられたら本題のテストができないので終了。

0 件のコメント:

コメントを投稿