5

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

4

1 回答 1

4

您可以创建一个名为“groovy.runtime.metaclass.CustomMetaClassCreationHandle”的类来全局处理元类创建过程。

在这个类中,你可以重写这个方法:

protected MetaClass createNormalMetaClass(Class theClass, MetaClassRegistry registry) {
  // if theClass instanceof Foo, return your special metaclass
  // else return super.createNormalMetaClass(theClass, registry)
}
于 2009-02-14T21:42:25.807 回答