LA RÉFLEXIVITÉ : Comprendre les objets

Simon LAMBERT
ELP-2018
Published in
4 min readJan 10, 2019

Comme un certain nombre de langage, Java est un langage dit réflexif. Cela signifie qu’il permet de mettre en place un mécanisme de programmation appelé réflexivité.

Figure 1 : Le penseur de Rodin

Mais qu’est ce que cela signifie ?

La réflexivité permet 2 choses :

  • L’introspection, qui est la capacité pour une classe d’observer ses états
  • La réflexion, qui est la capacité à modifier une classe, et par conséquent l’état de ses objets

Autrement dit, cela signifie que l’on va pouvoir observer à proprement parler la structure d’une classe. Pour cela, on appelle des méthodes sur un objet de type Class, qui correspond à la classe que l’on souhaite observer.

Par exemple, on va pouvoir déterminer :

- Les classes dont elle hérite
- Les interfaces qu’elle implémente
- La liste des méthodes de la classe, et la signature de ces méthodes
- La liste des champs d’une classe
- Etc.

La réflexivité dans Java :

Figure 2 : Code Java

Afin de comprendre comment fonctionne la réflexivité dans Java, il faut d’abord comprendre ce qu’est le langage Java, et comment il fonctionne.

Originellement, Java es un langage multi-plateformes. Le but est de pouvoir écrire du code une seule fois, et d’être capable de l’éxecuter sur des plateformes différentes. C’est ce que la compagnie Sun MicroSystems définit sous l’acronyme WORE : « Write Once, Run Everywhere ».

Pour pouvoir faire cela, le langage Java s’appuie sur la machine virtuelle Java, également appelée JVM (Java Virtual Machine). La JVM a pour but de pouvoir exécuter des bytecodes, qui sont en fait le résultat de la compilation de fichiers .java (mais pas uniquement, il existe aujourd’hui d’autres langages comme Scala qui créent des bytecodes également).

Figure 3 : Fonctionnement de la JVM

La JVM joue un rôle majeur dans la réflexivité, car c’est elle qui stocke l’ensemble des attributs, méthodes, interfaces et autres informations auxquelles une classe doit avoir accès. En effet, lorsqu’une classe est créée, la JVM créé un objet Class pour chacune d’entre elles. Ainsi, comme pour la majorité des objets, ce dernier va posséder un certain nombre de méthodes pour récupérer les renseignements sur cette classe.

Exemple de récupération de la classe parente de String :

Figure 4 : Récupération d’un attribut grâce à la réflexivité

Mais la réflexivité ne permet pas uniquement de récupérer des informations sur une classe.

Création d’une classe dynamiquement grâce à la réflexivité

Lorsque l’on crée un objet d’une certaine classe en Java, on utilise l’opérateur new.

Grâce à la réflexivité, on peut, de manière dynamique, instancier un objet d’une certaine classe sans utiliser cet opérateur. En effet, il nous est tout à fait possible de créer un objet Class correspondant à la classe désirée. Cela va nous permettre de récupérer des attributs de la classe qui permettent l’instanciation d’un objet, notamment grâce à des sous-objets de la classe Class.

Tout d’abord, nous allons créer un objet de type Constructor (un des sous-objet dont nous parlions ci-dessus) pour la classe donnée. Cela se fait grâce à l’appel de la méthode getConstructor() sur l’objet de type Class. À cette méthode, il faut passer des arguments, correspondant aux arguments d’instanciation de la classe désirée. Enfin, en appelant la méthode newInstance() avec les bons paramètres sur l’objet Constructor créé précédemment, on peut instancier notre objet.

Conclusion

En résumé, la réflexivité permet à un programme d’observer son état via l’observation de ses classes, mais également de les modifier. Pour cela, il exécute des méthodes sur des objets de type Class.

Bien qu’elle soit légèrement complexe à mettre en place, la réflexivité est aujourd’hui utilisée car elle permet d’apporter une certaine évolutivité aux programmes grâce à cette faculté de modification des classes.

À ce jour, la réflexivité est utilisée dans différents Frameworks Java, comme Tomcat qui permet de transférer des requêtes web en séparant certains de leurs paramètres, ou encore JUnit. Également, elle sert dans des IDE (Environnement de développement). Un des exemples que l’on peut citer est Eclipse, où elle permet de faire l’auto-complétion des noms de méthodes.

--

--