我正在尝试使用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的代理?
非常感谢。
答案 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()