Le blog de Fabien DUMINY

Un blog utilisant WordPress

Skip to: Content | Sidebar | Footer

Devoxx France 2012 – Manipulation de bytecode

7 mai, 2012 (09:00) | Devoxx France 2012, Evènement, Java | By: fabien

Durant Devoxx France 2012, j’ai assisté à la conférence intitulée Manipulation de bytecode : démocratisons la magie noire, présentée par Julien Ponge (son compte github) et Frédéric Le Mouel.

Parmi les librairies qui manipulent le bytecode, il y a les conteneurs d’EJBs, terracota pour distribuer les calculs et hibernate. Le plugin eclipse gérant la mise en page et l’affichage des écrans Android manipule aussi le bytecode afin d’instrumenter la vraie librairie utilisée dans Android.

Ensuite, Julien et Frédéric nous présentent rapidement le bytecode java : chaque type primitif est représenté en interne par une lettre, les packages des classes sont représentées avec des slash au lieu des points (exemple : java/lang/String)… La machine virtuelle destinée à utiliser le bytecode est une machine à pile avec une zone contenant les constantes (constant pool) et une autre contenant le code à exécuter (opcode). Pour illustrer cela, ils nous font la démonstration d’exécution du bytecode généré par la compilation d’un simple System.out.println pour afficher le résultat d’une addition. Nous pouvons ainsi voir l’évolution de la pile et des variables (les registres du processeur).

ASM est une des librairies permettant la manipulation du bytecode. Elle dispose de 2 APIs :

  • Une API basée sur un modèle événementiel, structurée autour du patron de conception visiteur. Cela peut servir pour faire le profilage de code java, en implémentant l’interface ClassFileTransformer.
  • Une API basée sur un modèle objet, chargeant tout le bytecode en mémoire sous la forme d’un arbre syntaxique du code (AST).

AspectJ est une autre librairie permettant de faire de la manipulation de bytecode. Celle-ci permet de faire de la programmation orientée aspect (AOP) pour, par exemple, rajouter des traces (appels de méthodes…), de la sécurité (vérification d’accès à certains services) ou de la validation (vérification des champs d’un formulaire) …
Pour illustrer cela, Julien et Frédéric font 2 démonstrations autour du calcul de la suite de Fibonacci, de manière récursive : la première est très lente et fait certains calculs plusieurs fois, la seconde est beaucoup plus rapide car elle utilisent AspectJ pour implémenter un cache des calculs déjà effectués.
Une autre utilisation possible est la modification d’une classe pour lui rajouter l’implémentation d’une interface qu’elle n’implémentait pas auparavant.

Byteman, une autre librairie permettant la manipulation du bytecode, implémente un agent qui modifie les classes d’une JVM en cours de fonctionnement, pour débugger par exemple. Byteman fournit également un injecteur de bytecode, à utiliser dans le setup de JUnit. Il devient ainsi possible, par exemple, de forcer File.mkdirs() à retourner false, ce qui permet d’améliorer la couverture des tests.
Pour accomplir sa tache, Byteman définit un langage proche du bytecode, qui permet de spécifier quelles sont les modifications à faire et l’endroit où il faut les placer.

Pour terminer la présentation, Julien et Frédéric nous présentent la version béta du projet de recherche JooFlux (celui-ci sera bientôt mis en open source). Ce projet utilise le travail de Rémi Forax sur le nouveau bytecode invokedynamic (introduit dans Java 7). Byteman modifie toute une classe, même si une seule de ses méthodes a changé (ce qui force le compilateur JIT à optimiser de nouveau l’ensemble des méthodes). A l’opposé, JooFlux ne modifie seulement ce qui est nécessaire, ce qui optimise l’utilisation du compilateur JIT. JooFlux dispose également d’une interface Swing/JMX pour gérer l’injection de bytecode. Comme exemple d’utilisation, on peut remplacer tous les appels invoke* par un appel invokedynamic.

Pour plus d’informations sur le bytecode, vous pouvez consulter les slides de la présentation JVM Bytecode for Dummies faite par Charles Nutter pour JavaOne 2011.

Be Sociable, Share!
Share and Enjoy

Write a comment





If your website is claim enabled, it will be notified that you have posted here.

MySQL query error