Les metaClass me rendent perplexe

Pour un projet que j'ai entamé il y a longtemps, je me suis dit récemment qu'il serait bien d'ajouter un binding groovy, à la fois à titre d'exemple de ce qu'on peut faire facilement, mais aussi parce que le groovy, c'est chouette (et que je pourrai ainsi utiliser toute la puissance modérée de gaedo avec gaelyk (et ça aura une bon sang de classe – surtout en utilisant maven-gaelyk, qui m'a l'air d'être la meilleure chose depuis le visage de Jésus sur des tranches de pain grillé).
J'ai donc commencé à coder des adaptations de mes composants de base à Groovy (parce que comme vous le savez, en groovy, on n'a pas de properties, mais des metaproprerties, ce qui change tout … ou pas). Donc, ça avançait bien (mis à part un problème de gestion des annotations), jusqu'à ce que j'essaye de mettre mes objets dans une map en leur associant leur nom.
Là, je crois que j'ai rencontré le démon.
Imaginez un peu.
Si dans une map vous faites

map["a"]="b";

Ca marche parfaitement.
Par contre, si vous faites

map["metaClass"]="d";

Ca part en sucette, comme le montre ma question sur StackOverflow, ou même le script original sur Groovy Web Console.
En fait, c'est simple.
Dans n'importe quel objet Groovy, il y a une propriété qui s'appelle metaClass, et qui est l'équivalent Groovy de la class Java. Et, comme le dit fort justement la réponse à ma question, écrire map["unAttribut"] revient pour l'interpréteur Groovy à écrire map.setUnAttribut (ou tout au moins à essayer de le faire). Hors, map.setMetaClass, c'est une méthode qui existe. C'est même une méthode qui est redéfinie pour la classe Object en groovy : (voir sa doc, Object#setMetaClass()). Du coup, je ne peux pas le faire.
Remarquez, je m'attendais un peu à ça, à cause des superbes Expando de Groovy. Mais je ne pensais pas que ça venait tout droit d'Object.
Bon, c'est pas trop grave, parce que ça ne me sert que dans du code de test. Mais c'est quand même troublant, je trouve.
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s