c:\>cat invalid.groovy
com.test.build(binding)
c:\junk>groovyc invalid.groovy
c:\junk>ls invalid.class
invalid.class
为什么这不会导致编译错误?com.test.build 没有这样的方法!
这种编译在什么场景下会成功?
c:\>cat invalid.groovy
com.test.build(binding)
c:\junk>groovyc invalid.groovy
c:\junk>ls invalid.class
invalid.class
为什么这不会导致编译错误?com.test.build 没有这样的方法!
这种编译在什么场景下会成功?
由于 Groovy 是动态的,它无法知道com.test.build
在运行时不会有
com
可能是稍后在代码执行中添加到绑定的对象
一个例子:
说我们里面有一点时髦Script.groovy
com.test.build( binding )
用 groovyc 编译它:
groovyc Script.groovy
然后,保留该Script.class
文件,并丢弃 groovy 脚本以确保我们使用的是类文件:
rm Script.groovy
现在,假设我们有以下内容Runner.groovy
// Create a class which you can call test.build( a ) on
class Example {
Map test = [
build : { it ->
println "build called with parameter $it"
}
]
}
// Create one of our Com objects
def variable = new Example()
// Load the Script.class, and make an instance of it
def otherscript = new GroovyClassLoader().loadClass( 'Script' ).newInstance()
// Then, set `com` in the scripts binding to be our variable from above
otherscript.binding.com = variable
// Then, run the script
otherscript.run()
打印:
build called with parameter groovy.lang.Binding@7bf35647
如您所见,它获取对象的test
参数com
(上图)并build
以绑定作为参数调用闭包...
希望这是有道理的...