在调用Script.run()之前,脚本绑定不起作用

时间:2019-01-23 11:13:06

标签: variables groovy binding integration

我有以下测试代码来弄清楚变量绑定是如何工作的。这就是我要导入/包含的内容;

# 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()方法感到有些困惑。有人可以解释我无法理解的地方吗?

谢谢

1 个答案:

答案 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}")