sli*_*lim 5 groovy metaprogramming interface metaclass
使用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)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我真的创建了类Foo的对象,这可以正常工作:
def myFoo = new Foo()
def fooProperty = myFoo.bar // metaclass invokes myFoo.someMethod("bar")
Run Code Online (Sandbox Code Playgroud)
但是如果Foo是一个接口,我想拦截方法调用它的任何实现呢?
def myFoo = FooFactory.create() // I don't know what class this will be
fooProperty = myFoo.bar
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以实现这一点,而不需要为每个已知的接口实现提供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)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1368 次 |
最近记录: |