使用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?