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

Groovy Closure not checking owner or delegate scope

我正在写一个小Groovy DSL,它依赖于Groovy Closures。然后,我使用 GroovyShellDelegatingScript.

Java 程序中 运行 DSL

从 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()
}

尽管我设置了 configClosuredelegate,但我得到一个 错误 ,即 testProperty 不是 [=20 的一部分=].我知道 DelScript 实例是 configClosurethis,因为我是在 DelScript 范围内创建它的,但我认为闭包会按顺序检查引用:this -> owner -> delegate。它从不检查 delegate 在我的情况下,但在检查 this.

后立即引发异常

任何人都可以就我做错了什么给我一些反馈吗?

行后

configClosure.delegate = x

configClosure.resolveStrategy = Closure.DELEGATE_FIRST