2009-02-12 17 views
4

En utilisant la convention de nom du package de Groovy, je peux intercepter la méthode Groovy appelle à une méthode Java comme ceci:Groovy: Délégation de métaclasse pour une interface?

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) 
    } 
} 

Cela fonctionne bien si je crée vraiment un objet de classe Foo:

def myFoo = new Foo() 
def fooProperty = myFoo.bar // metaclass invokes myFoo.someMethod("bar") 

Cependant ce si Foo est une interface, et que je veux intercepter des appels de méthode à n'importe quelle implémentation? Y a-t-il un moyen d'y parvenir sans disposer d'une DelegatingMetaClass pour toutes les implémentations connues de l'interface?

Répondre

3

Vous pouvez créer une classe nommée "groovy.runtime.metaclass.CustomMetaClassCreationHandle" pour gérer globalement le processus de création de métaclasses.

Dans cette classe, vous pouvez remplacer cette méthode:

protected MetaClass createNormalMetaClass(Class theClass, MetaClassRegistry registry) { 
    // if theClass instanceof Foo, return your special metaclass 
    // else return super.createNormalMetaClass(theClass, registry) 
} 
+0

Parfait. Merci. – slim