0

我想知道是否有一种方法可以让 Binding 对象存储对对象的引用,而不是复制一个?

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

不幸的是它打印“测试”。

有没有办法在 groovy 中做到这一点?

编辑:

我给出的例子是错误的,而且太简单了。

我认为我的问题发生是因为我在一个线程中实例化对象并在另一个线程中运行脚本。

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)
    }

}

所以 Test 对象是在一个线程中创建的,然后我将它作为对 Runnable 对象的引用传递,然后调用action,validateafterTest方法。如果我注释掉对setVariable构造函数的调用并取消注释它的调用validate将正常工作。

是否有可能是并发“问题”?在 afterTestScript 我只想打印响应字符串。

4

2 回答 2

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)
于 2014-08-27T20:12:43.260 回答
0

我在自己创建新线程时得到了这个。一旦我开始使用线程池,问题就消失了。

很有可能是因为其他一些变化,但这是我能看到的唯一会干扰 groovy shell 的变化。

最后,我们停止使用 groovy shell 来评估字符串,并开始将它们解析为脚本来运行它们。这是一个巨大的性能提升。

于 2012-02-16T16:07:27.680 回答