Groovyc成功编译了无效的groovy脚本

时间:2013-01-24 09:29:07

标签: groovy

c:\>cat invalid.groovy
com.test.build(binding)

c:\junk>groovyc invalid.groovy

c:\junk>ls invalid.class
invalid.class

为什么这不会导致编译错误? com.test.build没有这样的方法!

在什么情况下这个编辑会成功?

1 个答案:

答案 0 :(得分:0)

由于Groovy是动态的,因此无法知道运行时没有com.test.build

com可能是稍后在代码执行中添加到绑定的对象


一个例子:

说我们在Script.groovy

里面有一点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闭包... < / p>

希望这是有道理的......