2012-02-11 8 views
0

オブジェクトをコピーするのではなく、オブジェクトへの参照を格納するためのオブジェクトをバインドする方法があるのでしょうか?GroovyShellバインディングは、setVariableを実行するときにオブジェクトへの参照を渡すことができますか?

Binding b = new Binding() 
String test = "test" 
b.setVariable("sth", test) 
test = "blah" 
GroovyShell gs = new GroovyShell(b) 
gs.evaluate("print(sth)") 

残念ながら、「テスト」が印刷されます。

Groovyで行う方法はありますか?

EDIT:

私が与えた例が間違ったとあまりにも簡単でした。

私は1つのスレッドでオブジェクトをインスタンス化し、別のスレッドでスクリプトを実行するため、私の問題が発生すると思います。

class Test { 


[...] // field declarations 

    public Test(String name, String url, def params, String validateScript, String afterTestScript, GroovyShell shell) { 

[...] //just assigning params to fields 

     shell.setVariable("current", this) 
    } 


    void action() { 


     response = "something" 

    } 

    void validate() { 
     //shell.setVariable("current", this) 
    } 

    void afterTest() { 
     if (afterTestScript) shell.evaluate(afterTestScript) 
    } 

} 

だからテストオブジェクトは1つのスレッドで作成され、その後、私は、actionvalidateafterTestメソッドを呼び出すRunnableオブジェクトへの参照として渡します。 コンストラクタ内のsetVariableへのコールをコメントアウトし、validateでコールのコメントを外しても正常に動作します。

同時実行性「問題」は可能でしょうか? afterTestScriptでは、レスポンス文字列を出力したいだけです。

答えて

0

私自身で新しいスレッドを作成するときにこれを取得していました。 スレッドプールを使い始めると、問題はなくなりました。

それは他の変更のためであった可能性がありますが、これは私がグルービーシェルを妨げることがわかった唯一の変更です。

最後に、groovyシェルを使用して文字列を評価することをやめ、スクリプトを解析して実行しました。これは大きなパフォーマンス向上でした。

0

問題の本質は、実際には、オブジェクト参照を設定した後に変更されるためです。それを割り当てた後に変更する場合は、ラッパーオブジェクトが必要です。例えば。代わりに

String test = "test" 
b.setVariable("sth", test) 
test = "blah" 
GroovyShell gs = new GroovyShell(b) 

の使用

class MyWapper { 
    public String myText 
    public MyWrapper(String text){ 
    this.myText = text; 
    } 
} 

MyWrapper test = new MyWrapper("test") 
b.setVariable("sth", test) 
test.myText = "blah" 
GroovyShell gs = new GroovyShell(b) 
関連する問題