【问题标题】:Groovy: Delegating metaclass for an Interface?Groovy:为接口委托元类?
【发布时间】:2010-10-07 07:22:31
【问题描述】:

使用 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 的情况下实现这一点?

【问题讨论】:

    标签: interface groovy metaprogramming metaclass


    【解决方案1】:

    您可以创建一个名为“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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 2021-02-20
      • 1970-01-01
      • 2012-02-11
      • 2012-07-05
      • 2011-02-10
      • 2015-11-12
      • 2012-01-31
      相关资源
      最近更新 更多