这是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属性访问成语对于这种情况不起作用 . 这是预期的行为吗?