在Groovy中设置MethodClosure的委托

时间:2011-08-10 14:37:03

标签: methods groovy delegates closures

我正在尝试使用Groovy闭包和代理。我有以下代码将闭包的委托设置为另一个类,它完全正常。

def closure = {
    newMethod()
};
closure.setDelegate(new MyDelegate());
closure.setResolveStrategy(Closure.DELEGATE_ONLY);
closure();

class MyDelegate {
    public void newMethod() {
        println "new Method";
    }
}

打印出“new Method”,显示MyDelegate中的newMethod()实际被调用。现在我正在尝试使用MethodClosure。

public class TestClass {
    public void method() {
        newMethod();
    }
}

TestClass a = new TestClass();
def methodClosure = a.&method;
methodClosure.setDelegate(new MyDelegate());
methodClosure.setResolveStrategy(Closure.DELEGATE_ONLY);
methodClosure();

class MyDelegate {
    public void newMethod() {
        println "new Method";
    }
}

然而,这一次,我得到以下异常: 线程“main”中的异常groovy.lang.MissingMethodException:没有方法签名:TestClass.newMethod()适用于参数类型:()values:[]。

因此,对于这个方法,它似乎根本不会进行方法查找的委托。我有一种感觉,这可能是预期的行为,但有没有办法实际使用MethodClosures的代理?

非常感谢。

1 个答案:

答案 0 :(得分:1)

MethodClosures实际上只是通过Closure接口调用方法的适配器。正如你所见,它没有授权。

将MyDelegate用作委托的一种方法是混合使用,如下所示:

TestClass a = new TestClass()
a.metaClass.mixin MyDelegate
def methodClosure = a.&method
methodClosure()

// or skip the closure altogether
TestClass b = new TestClass()
b.metaClass.mixin MyDelegate
b.method()