Groovy dynamique de la propriété par objet
À L'Aide De Groovy 1.8. Je suis en train de créer une dynamique de classe définition des propriétés de cache par objet. J'ai fait d'utiliser propertyMissing
sans l'ajout de la propriété de l'objet de l'amende juste. Je pense juste que la mise en cache des propriétés serait plus efficace. Droit?
Noter que chaque instance doit avoir ses propres propriétés différentes.
Le code ci-dessous fonctionne très bien:
class C {}
def c = new C()
c.metaClass.prop = "a C property"
println c.prop
def x = new C()
x.prop
sera de sortie:
a C property
groovy.lang.MissingPropertyException: No such property: prop for class: C
Si j'ai besoin de cette problématique:
class A {
def propertyMissing(String name) {
if(!this.hasProperty(name)) {
println "create new propery $name"
this.metaClass."$name" = "Dyna prop $name"
println "created new propery $name"
}
this.metaClass."$name"
}
}
a = new A()
println a.p1
Pour A
, je reçois autant que "créer une nouvelle propriété", mais la ligne this.metaClass."$name" = "Dyna prop $name"
échoue avec: No such property: p1 for class at line 5
Quoi de mal?
InformationsquelleAutor Ayman | 2011-07-04
Vous devez vous connecter pour publier un commentaire.
Ce code devrait faire ce que vous voulez:
Que les sorties:
Pourquoi ne pas stocker vos propriétés dynamiques dans une simple table de hachage?
C'est le standard exemple: http://groovy.codehaus.org/Using+methodMissing+et+propertyMissing
Remarque, vous n'avez pas à vérifier si la propriété est vraiment en manque ... si elle n'est pas manquant, la méthode ne serait pas appelé en premier.
ExpandoMetaClass n'est pas vraiment conçu pour être utilisé après l'initialisation ou variables d'instance (voir la référence ci-dessous, à moins de 1,6 ou plus).
Peut-être que vous souhaitez utiliser Runtime mixin. Plus d'informations ici et ici.
Vous voudrez peut-être lire un article sur le blog, une solution de contournement est prévue pour définir les propriétés à l'exécution. Et les groovy bug (qui n'est pas vraiment un bug) qui lui sont liées.
J'ai vu dans la section commentaires et vérifiés au moins dans la version 1.6 ExpandoMetaClass documentation: