加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy:为接口委派元类?

发布时间:2020-12-14 16:28:06 所属栏目:大数据 来源:网络整理
导读:使用Groovy的包名约定,我可以拦截对 Java方法的Groovy方法调用,如下所示: package groovy.runtime.metaclass.org.myGang.myPackageclass FooMetaClass extends groovy.lang.DelegatingMetaClass{ FooMetaClass(MetaClass delegate) { super(delegate); } pu
使用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?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读