Может ли привязка GroovyShell передавать ссылку на объект при выполнении setVariable? - PullRequest
0 голосов
/ 11 февраля 2012

Мне интересно, есть ли способ для объекта Binding для сохранения ссылки на объект вместо ее копирования?

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

К сожалению, он печатает "тест".

Есть ли способ сделать это в Groovy?

EDIT:

пример, который я привел, был неправильным и слишком простым.

Я думаю, что моя проблема возникает из-за того, что я создаю экземпляр объекта в одном потоке и запускаю сценарий в другом.

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, validate и afterTest. Если я закомментирую вызов setVariable в конструкторе и раскомментирую вызов в validate, он будет работать нормально.

Возможно ли, что это проблема параллелизма? В afterTestScript я просто хочу напечатать строку ответа.

Ответы [ 2 ]

0 голосов
/ 28 августа 2014

Суть вашей проблемы на самом деле связана с тем, что ссылка на ваш объект изменяется после установки. если вы хотите изменить его после назначения, вам понадобится объект-оболочка. Например. вместо

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)
0 голосов
/ 16 февраля 2012

Я получал это при создании новых тем самостоятельно. Как только я начал использовать пул потоков, проблема ушла.

Вполне возможно, что это произошло из-за какого-то другого изменения, но это единственное изменение, которое я мог видеть, мешая шпунтованию оболочки.

В конце мы перестали использовать groovy shell для оценки строк и начали анализировать их в скриптах для их запуска. Это был огромный прирост производительности.

...