我正在写一个小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
的{{1}},但我得到错误,configClosure
不属于testProperty
。我知道DelScript
实例是DelScript
的{{1}},因为我在this
范围内创建了它,但我认为闭包会检查顺序中的引用:configClosure
。它永远不会在我的情况下检查DelScript
,但在检查this -> owner -> delegate
后立即引发异常。
任何人都可以就我的错误给我一些反馈吗?
答案 0 :(得分:1)
行后
configClosure.delegate = x
把
configClosure.resolveStrategy = Closure.DELEGATE_FIRST