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

Script binding does not work before calling Script.run()

我有以下测试代码来弄清楚变量绑定是如何工作的。所以这就是我想要的 import/include;

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

因为这两种方法 return 都是一个 Script 实例,所以我有点困惑为什么我必须在第一种情况下调用 run() 方法。有人能解释一下我哪里不明白吗?

谢谢

运行 groovyconsole(与groovy一起分发)

输入一个简单的脚本:

number=44
return this

select 菜单 Script -> Inspect Ast

并且在新的 window Groovy AST Browser select phase = Conversion

您将看到您的 groovy 脚本,但已转换为这样的脚本 class:

public class script1548245785832 extends groovy.lang.Script { 
    public script1548245785832() {
    }

    public java.lang.Object run() {
        number = 44
        return this 
    }
}

这是为您的脚本生成的实际代码。

如您所见,构造函数是空的,因此在调用 newInstance()

后没有关于 number 属性 的信息

但是在你调用 run() 之后你实际上 运行 你的脚本。


您的脚本可以是这样的 class:

class Importee {
    int number=44
    public Object run(){
        println number
    }
}

在这种情况下,无需调用 run() 方法就可以创建 class 的实例并获取数字变量的值...

def clazz = gcl.parseClass( new File("Importee.groovy")) )
def script = clazz.newInstance()   

println("the variable: ${script.number}")