我有以下测试代码来弄清楚变量绑定的工作原理。所以这就是我想导入/包含的内容;
# importee.groovy
import groovy.transform.Field
@Field top = 60
number = 44 // binding variable
int ratio = 4.5
return this
我称之为;
# importer.groovy (version1)
import groovy.lang.GroovyClassLoader
def gcl = new GroovyClassLoader()
def clazz = gcl.parseClass(new File("importee.groovy")) )
assert clazz.name == 'importee'
def script = clazz.newInstance()
//script.run()
println("binding variable:
${script.getBinding().getVariable("number")}")
因此,如果我不运行脚本,我的测试代码会在最后一个打印语句上抛出"MissingPropertyException"。如果我打电话给def script = evaluate(new File("importee.groovy"))
而不是像这样使用GroovyClassLoader
,就不会发生这种情况;
# importer.groovy (version2)
def script = evaluate(new File("importee.groovy"))
println("binding/global variable: ${script.number}")
由于这两种方法都返回一个Script
实例,因此我对为什么在第一种情况下必须调用 run()
方法有点困惑。有人可以解释一下我无法理解的地方吗?
谢谢
run groovyconsole
(与 groovy 一起分发)
键入一个简单的脚本:
number=44
return this
选择菜单Script -> Inspect Ast
然后在新窗口中Groovy AST Browser
选择phase = Conversion
您将看到您的时髦脚本,但转换为如下所示的脚本类:
public class script1548245785832 extends groovy.lang.Script {
public script1548245785832() {
}
public java.lang.Object run() {
number = 44
return this
}
}
这是为脚本生成的实际代码。
如您所见,构造函数为空,因此调用number
属性后没有关于newInstance()
但是在调用run()
之后,您实际上运行了脚本。
您的脚本可以是如下所示的类:
class Importee {
int number=44
public Object run(){
println number
}
}
在这种情况下,无需调用run()
方法即可创建类实例并获取数字变量的值...
def clazz = gcl.parseClass( new File("Importee.groovy")) )
def script = clazz.newInstance()
println("the variable: ${script.number}")