2009-02-12 2 views
4

Использование пакета имя конвенции Groovy, я могу перехватить метод 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 

Есть ли способ достичь этого, не имея делегированияMetaClass для каждой известной реализации интерфейса?

ответ

3

Вы можете создать класс с именем "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) 
} 
+0

Perfect. Благодарю. – slim

Смежные вопросы