我在写一个小的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()
}


尽管我设置了delegateconfigClosure,但我收到一个错误,指出testProperty不是DelScript的一部分。我知道DelScript实例是thisconfigClosure,因为我是在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/

10-09 03:06