脚本绑定在调用 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}")
我有以下测试代码来弄清楚变量绑定是如何工作的。所以这就是我想要的 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}")