2008-12-19 5 views
2

Les classes ProxyMetaClass et Iterceptor pour l'interception d'appels de méthode Groovy arbitraires sont bien documentées. Y a-t-il aussi un moyen d'intercepter les accès aux propriétés? Lorsque je tente de le faire en interceptant « getProperty », je reçois toujours le message d'erreur:Comment intercepter des accès de propriété dans Groovy avec ProxyMetaClass?

groovy.lang.MissingPropertyException: Aucun bien: foo

Répondre

1

Je ne suis pas complètement sûr de l'utilisation cas que vous essayez de résoudre, mais vous voulez probablement l'un des propertyMissing ou getProperty (or maybe invokeMethod).

Le premier vous permettra d'intercepter les demandes de propriété quand ils ne sont en fait sur l'objet:

class Person { 
    def name = "Ted" 
    def propertyMissing(String name) { "my $name" } 
} 

def p = new Person() 
assert "my address" == p.address 
assert "my email" == p.email 
assert "Ted" == p.name // property isn't missing 

La seconde vous permettra d'intercepter toutes les demandes de propriété, même pour les propriétés définies:

class Person { 
    def name = "Ted" 
    def getProperty(String name) { "my $name" } 
} 

def p = new Person() 
assert "my address" == p.address 
assert "my email" == p.email 
assert "my name" == p.name 

Si vous travaillez avec une classe existante, vous pouvez soit la sous-classer avec l'une de ces méthodes, soit ajouter ces méthodes à la métaClasse:

String.metaClass.getProperty = { String name -> 
    return "String's property $name" 
} 

assert "String's property foo" == "".foo 
0

Votre approche semble être correcte. Essayez quelques-unes des recettes here.

S'attacher à des pailles: l'objet sur lequel vous appelez les méthodes est-il réellement de la classe que vous avez métaprogrammée? Parfois, en raison du polymorphisme, vous n'utilisez pas la classe que vous pensez être.

Questions connexes