juin
2008
Ce samedi (Hier), ayant besoin de faire quelques manips nécessitant de la reflection sur les JavaBeans, j’ai décidé (pour une fois) de ne pas vouloir réinventer la roue (en développant mon propre code via l’API standard de reflection), j’ai voulu voir du côté de common-beans du jakarta-commons (comme tout développeur Java qui se respecte).
J’ai bel et bien le jar, seulement, pas de chance: pas de JavaDoc ni de sources d’internet … hum … que faire ? Y aller à la dure via jad et une bonne dose de lecture ? Non merci: le WE est trop court pour ça (d’ailleurs, trop court pour que je ne touches à la programmation tant qu’on y est, mais bon, geek tel que je le suis …).
J’y suis donc allé en réinventant la roue: du super-joli code avec l’API standard de reflection de Java (celui des JavaBeans, via Introspector, pas l’autre accessible depuis Class).
En vérité, j’ai déjà fait ça à plusieurs reprise, j’ai donc fait du copier/coller, mais bon…
Seulement, ça n’etait pas aussi simple que ça en avait l’air: il me fallait un mécanisme de conversion.
En fait, il s’agissait de remplir génériquement un objet à partir d’un ResultSet (voir billet précédent), et il peut arriver par exemple q’un champ de l’objet soit de type Long tandis que le type dans le ResultSet soit un Integer … plaf, une bonne « Incompatible Types » me saute à la figure.
J’ai d’abord fait quelques essaies avec les PropertyEditors, mais je ne sais par quel partie (atrophiée) de ma cervelle j’ai du décider que j’avais pas trop la flemme de lire la JavaDoc … wow ! fallait vraiment la sortir celle là !
J’ai plutôt décidé d’y aller vraiment à la dure (cf plus haut), et j’ai été voir comment les messieurs des autres frameworks s’y prenaient.
Mon premier candidat était Hibernate (là, j’avais les sources, Dieu Merci).
J’ai vraiment pas approfondi la chose, mais en gros j’ai vu qu’il (Gavin) utilisait la reflection standard de Java pour acceder aux propriétés, et qu’il se donne un mal fou pour ça: il itère sur toutes les méthodes d’une classe pour récupérer celles qui commencent par un set et qui prennent un seul paramètre, puis il extrait la partie du nom après le set, décapitalise la première lettre et compare ça avec le nom de la propriété.
Mais ça s’explique par le fait qu’ainsi, il peut même accéder aux getters et setters privés ou protégés.
J’ai alors abandonné Hibernate, et je me suis tourné vers Spring (2.5.2), et plaf: je trouve mon bonheur: BeanWrapper, qui comme son nom l’indique, offre des fonctionnalité de haut niveau sur un bean.
Par exemple, il offre une zolie méthode BeanWrapper.setPropertyValue(String propertyName, Object value): Ma salive coulait déjà sur mon clavier.
De plus, je savais déjà que Spring effectuait déjà transparament la conversion des types (depuis le XML vers les champs des objets).
J’etais dans le bon, après quelques essaies, ce BeanWrapper fonctionne à merveille: je ne fais qu’appeler une méthode en lui passant la valeur en Object (comme un coch**), et c’est lui qui s’occupe des details gore en tache de fond (reflection, conversion, etc.)
Bref: si vous êtes sur Spring, et que vous avez besoin d’une rapide manip de reflection, n’oubliez pas de considerer BeanWrapper
Hello,
Intéressant comme billet!
Merci