使用 Groovy 的包名称约定,我可以像这样拦截对 Java 方法的 Groovy 方法调用:
package groovy.runtime.metaclass.org.myGang.myPackage
class FooMetaClass extends groovy.lang.DelegatingMetaClass
{
FooMetaClass(MetaClass delegate)
{
super(delegate);
}
public Object getProperty(Object a, String key)
{
return a.someMethod(key)
}
}
如果我真的创建了一个 Foo 类的对象,这很好用:
def myFoo = new Foo()
def fooProperty = myFoo.bar // metaclass invokes myFoo.someMethod("bar")
但是,如果 Foo 是一个接口,并且我想拦截对它的任何实现的方法调用怎么办?
def myFoo = FooFactory.create() // I don't know what class this will be
fooProperty = myFoo.bar
有没有办法实现这一点,而无需为接口的每个已知实现使用 DelegatingMetaClass?