这是Groovy doc本质上用于创建自定义脚本类的示例,然后使用引用该自定义Script类的CompilerConfiguration对象实例化GroovyShell对象:

import org.codehaus.groovy.control.CompilerConfiguration

abstract class MyScript extends Script {
    String name
    String greet() {
       "Hello, $name"
    }
}

def config = new CompilerConfiguration()
config.scriptBaseClass = 'MyScript'
shell = new GroovyShell(this.class.classLoader, new Binding(), config)
script = shell.parse('greet()')
assert script instanceof MyScript
script.setName('Foo')
assert script.run() == 'Hello, Foo'

现在当我将 script.setName('Foo') 更改为 script.name = 'Foo' 时:

import org.codehaus.groovy.control.CompilerConfiguration

abstract class MyScript extends Script {
    String name
    String greet() {
       "Hello, $name"
    }
}

def config = new CompilerConfiguration()
config.scriptBaseClass = 'MyScript'
shell = new GroovyShell(this.class.classLoader, new Binding(), config)
script = shell.parse('greet()')
assert script instanceof MyScript
script.name = 'Foo'
assert script.run() == 'Hello, Foo'

它用以下输出打破了一些东西:

Caught: Assertion failed: 

assert script.run() == 'Hello, Foo'
       |      |     |
       |      |     false
       |      Hello, null
       Script1@243c4f91

Assertion failed: 

assert script.run() == 'Hello, Foo'
       |      |     |
       |      |     false
       |      Hello, null
       Script1@243c4f91

   at bar.run(bar.groovy:16)

这清楚地表明Groovy属性访问成语对于这种情况不起作用 . 这是预期的行为吗?