我有以下测试代码来弄清楚变量绑定是如何工作的。这就是我要导入/包含的内容;
# 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()
方法感到有些困惑。有人可以解释我无法理解的地方吗?
谢谢
答案 0 :(得分:1)
运行groovyconsole
(随groovy一起分发)
输入一个简单的脚本:
number=44
return this
选择菜单Script -> Inspect Ast
,然后在新窗口Groovy AST Browser
中选择phase = Conversion
您将看到groovy脚本,但将其转换为如下所示的Script类:
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}")