Comme bien des langages OO, Java permet aux programmes de réaliser la réflexivité dynamique, soit la représentation des entités du programme à même le programme.
Pour le tronçon impliquant de la réflexivité, nous aurons recours aux classes et outils du paquetage java.lang.reflect. |
|
Nous utiliserons une petite classe, somme toute simple mais avec une (courte) gamme de services incluant méthodes de classe, méthodes d'instance, attributs, constructeurs, membres privés et publics, et même un risque de levée d'exception. La classe ValeurInvalideException sera le mécanisme utilisé pour souligner qu'une valeur utilisée dans le programme n'est pas convenable. |
|
J'utiliserai une classe X, banale, qui permet d'entreposer un entier positif, de même que ses quelques services, pour les besoins de l'exposé. |
|
Le code utilisé en exemple sera logé dans la classe Réflexivité, et se subdivisera en deux méthodes de classe nommées respectivement testSansRéflexivité() et testAvecRéflexivité(). Ces deux méthodes feront le même travail, mais avec réflexivité ou sans réflexivité selon le cas. Les paramètres reçus au lancement de Réflexivité.main() sont relayés aux deux fonctions de test, qui essaieront de les transformer en int dans l'optique d'instancier divers X. |
|
La version sans réflexivité prend plusieurs String, les convertit une à une en int pour instancier un X (ce qui est susceptible de lever une exception si le int ne convient pas aux règles d'affaires d'un X) puis affiche la valeur du X résultant. La fonction se termine lorsque tous les paramètres ont été traités, ou lors de la première levée d'exception qui y est constatée, que cette-dernière soit levée par l'instanciation d'un X ou par la tentative de conversion d'une String en int. |
|
La version avec réflexivité fait la même chose, mais en passant par les mécanismes plus dynamiques, plus flexibles, mais aussi plus complexes et plus lents que Java met à la disposition des programmeuses et des programmeurs. Ainsi, pour créer un X :
Remarquez que les cas d'exceptions possibles sont bien plus nombreux ici : puisque nous faisons manuellement ce qui aurait pu être fait (et validé) par les mécanismes plus directs, il y a dans notre code plus d'aspects risqués. L'exception ValeurInvalideException n'apparaît pas dans la liste, toutefois, car les mécanismes de Java ne sont pas Exception-Neutral. Si une exception est levée par l'appel à newInstance(), cette exception sera consommée par la fonction et masquée par une exception plus générique (voir l'exemple ci-dessous). |
|
Une exécution possible de ce programme, invoqué comme suit :
java Réflexivité 3 7 0 -8
... serait la suivante :
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Test sans recours a la reflexivite
X construit, valeur: 3
X construit, valeur: 7
X construit, valeur: 0
X non-construit, raison --> Valeur invalide: -8
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Test avec recours a la reflexivite
X construit, valeur: 3
X construit, valeur: 7
X construit, valeur: 0
class java.lang.reflect.InvocationTargetException... --> null
Quelques liens supplémentaires pour enrichir le propos.