我在写一个小的Groovy DSL
,它依赖于Groovy Closures
。然后,使用DSL
和Java
从GroovyShell
程序运行DelegatingScript
。
从Java调用脚本的代码:
DelScript project = new DelScript ();
CompilerConfiguration cc = new CompilerConfiguration();
cc.setScriptBaseClass("groovy.util.DelegatingScript");
GroovyShell sh = new GroovyShell(Launcher.class.getClassLoader(), new Binding(), cc);
DelegatingScript script = (DelegatingScript) sh.parse(new File(path));
script.setDelegate(project);
script.run();
DelScript
的实例用作脚本内的this
引用,例如在DelScript
的实例中搜索在脚本本身中找不到的任何成员或方法。我的脚本可以包含以下表达式:
create (name: "test") {
// this code can be used to initialize the
// object that is created here
testProperty = "I'm an example"
}
这段代码的目的是创建一个对象,然后调用闭包,该闭包可用于初始化它。正如我之前所说,
create
方法驻留在DelScript
实例中(这是我想要的),它看起来像这样:def create(arguments, configClosure) {
// create new object
def x = new Impl(arguments)
// use configClosure to init it
configClosure.delegate = x
configClosure()
}
尽管我设置了
delegate
的configClosure
,但我收到一个错误,指出testProperty
不是DelScript
的一部分。我知道DelScript
实例是this
的configClosure
,因为我是在DelScript
范围内创建的,但是我认为闭包将按以下顺序检查引用:this -> owner -> delegate
。就我而言,它从不检查delegate
,但在检查this
之后立即引发异常。谁能给我一些我做错的反馈?
最佳答案
下线后
configClosure.delegate = x
放
configClosure.resolveStrategy = Closure.DELEGATE_FIRST
关于java - Groovy Closure不检查所有者或委托(delegate)范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28012523/