Groovy Closure不检查所有者或委托范围

时间:2015-01-18 17:17:08

标签: java groovy closures dsl

我正在写一个小Groovy DSL,它依赖于Groovy Closures。然后,我使用DSLJavaGroovyShell计划运行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后立即引发异常。

任何人都可以就我的错误给我一些反馈吗?

1 个答案:

答案 0 :(得分:1)

行后

configClosure.delegate = x

configClosure.resolveStrategy = Closure.DELEGATE_FIRST