—Réflexivité comportementale en Java Réflexivité (Fractal) —
Modifications autorisées I
Le scénario le plus courant pour l’utilisation des bibliothèques
comme BCEL, ASM et Javassist consite à s’interposer entre la
machine virtuelle et les fichiers .class, au moment du
chargement pas le chargeur de classes, pour donner aux
programmes la possibilité de modifier leur code avant leur mise
en mémoire dans la machine virtuelle.
Un scénario devenu possible depuis la version 6 de Java et son
API java.lang.instrumentation, consiste à lire le fichier
.class depuis la mémoire de la machine virtuelle, de le modifier,
puis de le réintroduire dans la machine virtuelle pour se
substituer à l’ancienne version.
9 / 60
—Réflexivité comportementale en Java Réflexivité (Fractal) —
Modifications autorisées II
Dans ces deux types de scénario, Java impose à la nouvelle
version de la classe de se conformer à sa signature initiale, de
manière à ne pas remettre en cause la compilation des autres
classes.
Il est donc possible d’ajouter du code ou de modifier le contenu
des méthodes déjà présentes, mais pas de modifier la signature
des méthodes déjà présentes ni a fortiori de les supprimer.
10 / 60
—Réflexivité comportementale en Java Réflexivité (Fractal) —
Javassist en quelques mots
Javassist est un bibliothèque permettant de manipuler les classes
sous leur forme compilée (.class).
Javassist se caractérise par le fait que les manipulations
autorisées se font au moment du chargement :
Les documents sur Javassist parlent de « compile-time »,
c’est-à-dire à la compilation.
C’est en fait un abus de langage, puisque la classe est déjà
compilée ; il s’agit plutôt de réflexion au chargement
(« load-time »), voir dynamique depuis Java 6 (« run-time »).
Javassist offre une interface de haut niveau permettant de
manipuler le code sous forme de source Java et non de code
octal JVM.
11 / 60
—Réflexivité comportementale en Java Réflexivité (Fractal) —
Principes généraux
Lors du (re)chargement des classes, il est possible d’intervenir
sous la forme d’un filtre entre le contenu des « fichiers » .class
et la définition de la classe dans la machine virtuelle, selon un
patron de conception Observateur.
Une fois la classe chargée, Javassist la représente en mémoire à
l’aide d’une bibliothèque réifiant leur contenu sous forme d’objets,
bibliothèque qui a été conçue pour ressembler autant que
possible à la bibliothèque standard java.lang.reflect.
Chaque classe est représentée par un unique objet, instance de
la classe CtClass, pour « compile-time class », version au
chargement de la classe Class de Java.
Les manipulations sont autorisées tant que la classe n’est pas
mise à disposition de la machine virtuelle ; ensuite, la classe est
gelée et rendue inaccessible pour Javassist1.
12 / 60