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



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

# 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}")

相关内容

最新更新