Java Instrumentation et réflexivité en Java et 6.0 UPMC November 9, 2006 (UPMC) Instrumentation November 9, 2006 1 / 28
Java Petit Plan Plan de ce cour 1 Présentation de l Instrumentation 2 Présentation de la nouvelle API 3 Partie Instrumentation 4 Partie Instrumentation 5 Théoriques 6 Pratiques 7 8 Présentation des changements en 6.0 9 s 10 Questions (UPMC) Instrumentation November 9, 2006 2 / 28
Instrumentation : Définition Java Instrumentation Définition : Est considéré comme instrumentation toute opération visant à modifier un programme pour en suivre le comportement. Exemples : debug, monitoring, couverture de code, profiling. (UPMC) Instrumentation November 9, 2006 3 / 28
Instrumentation : Avant Java Java API précédentes Il est à noter qu avant l API, il n y avait pas de mécanismes dédiés à l instrumentation de code. Les problèmes d instrumentation était traités par catégories: Le débug par Java Platform Debugger Architecture [Sun04a]. Le monitoring par certaines classes dédiées. La couverture de code n était pas gérée du tout. Le profiling n était pas gérer du tout. (UPMC) Instrumentation November 9, 2006 4 / 28
Instrumentation : Avant Java Java Pour conclure, en Java comme dans tous les autres langages il fallait écrire sois même les programmes visant à ajouter du code d instrumentation dans les sources afin d obtenir un compilé instrumenté. Ou creer un programme d instrumentation exterieur via JPDA [Sun04a], ce qui peut se révéler beaucoup plus élégant. (UPMC) Instrumentation November 9, 2006 5 / 28
de Java Java API L API de Java [Sun04b] apporte un nouveau package : java.lang.intrument qui contient deux services. Un service d instrumentation statique, ClassFileTransformer Un service dynamique, la redéfinition de classe. Ces deux services secouent le principe de simplicité de Java car ils demandent de savoir manipuler le code octet des classes. (UPMC) Instrumentation November 9, 2006 6 / 28
Instrumentation statique: Class File Transformer Java API Un Class File Transformer est une classe qui implante : byte[] transform(classloader loader, String classname, Class<?> ClassBeingRedefined, byte[] classbuffer) Cette classe vient se greffer à tout les chargeurs de classes pour en modifier le code octet chargé. Cette méthode permet d accéder au code octet et à la réification des classes, avant de les modifier. (UPMC) Instrumentation November 9, 2006 7 / 28
Instrumentation statique: Class File Transformer Java Mise en place Le paquet : java.lang.intrument permet l ajout ou le retrait des Class File Transformer : void addtransformer( ClassFileTransformer transformer) boolean removetransformer( ClassFileTransformer transformer) La partie statique du paquet instrumentation sert donc au chargement et au déchargement des instrumenteurs. (UPMC) Instrumentation November 9, 2006 8 / 28
Instrumentation statique: Class File Transformer Java Mise en place Cependant certains services utiles ne sont pas fournis par cette API, il n est pas possible: de connaître quels sont les instrumenteurs couramment en services (sauf en essayant de les enlever). de savoir quelle classe à été modifié par quel instrumenteur. (UPMC) Instrumentation November 9, 2006 9 / 28
Instrumentation statique: Class File Transformer Java Mise en place Autre problème, sachant que les instrumenteurs sont attachés aux chargeurs de classes par l appelle à addtransformer. Même si cette commande est la première instruction du main de vôtre application, elle sera presque sans effet. Les chargeurs de classes ne vont pas attendre le dernier moment pour charger les classes d une application en mémoire. La plus part des classes du programme seront déjà résidente dans la JVM qui pré-charge un grand nombre de classes, elles ne passeront donc pas par l instrumenteur. (UPMC) Instrumentation November 9, 2006 10 / 28
Instrumentation statique: Class File Transformer Java Solution Utiliser les agents Java. Un Agent java est un Jar précisé à la ligne de commande de lancement d une application. Ce Jar contiens un certains nombre de classes, avec un premain qui est exécuté avant le démarrage de la JVM, permettant de charger les instrumenteurs avant le chargement des classes à instumenter. (UPMC) Instrumentation November 9, 2006 11 / 28
Instrumentation statique: Java une implémentation périlleuse Apport d un moyen d instrumenter du code, au niveau du code octet. Pas de réflexion de l entité Class (toujours lisible, mais pas modifiable). Avec des problèmes d implémentation et de visibilité. Méthode classique chez les implémenteurs de langages, si c est dur a implémenter alors que l utilisateur le fasses. Il vaut mieux que ça soit le programme de l utilisateur qui plante, plutôt que la machine virtuelle. (UPMC) Instrumentation November 9, 2006 12 / 28
Instrumentation dynamique: Redéfinition de classe Java API le paquet java.lang.instrument propose une méthode pour redéfinir un lot de classes : void redefineclasses(classdefinition[] definitions) Sachant qu une ClassDefinition est un couple (class,byte[]). Ici encore on doit pouvoir fournir du code octet valide représentant une classe. (UPMC) Instrumentation November 9, 2006 13 / 28
Java Instrumentation dynamique: Redéfinition de classe Réflexion comportemental A la vue de cette nouvelle fonctionnalité, les anciens de smalltalk 80, réveillent leurs instincts profonds et pense pouvoir reprendre leurs anciennes activités étranges : ajouter des champs à une classe, enlever des champs à une classe, ajouter des méthodes, les retirer, changer l arbre d héritage, les interfaces implémentés, dériver les mécanismes internes du langage. Et bien non, tout ceci n est pas possible avec la version de la machine virtuelle. (UPMC) Instrumentation November 9, 2006 14 / 28
Instrumentation dynamique: Redéfinition de classe Java Réflexion comportemental: un espoir Les spécifications pour cette méthode sont strictes, rien n a été changé dans la JVM, les seuls opérations permises sont la redéfinition du code des méthodes et des valeurs des éléments constants, sous peine de faire planter la JVM. Il est donc possible d utiliser de la réflexion comportementale au moins au niveau des méthodes. Remarque: les restrictions sur les modifications des classes pourrait être levés dans les futurs versions de la JVM... (UPMC) Instrumentation November 9, 2006 15 / 28
Instrumentation dynamique: Redéfinition de classe Java Réflexion comportemental: Clash des méthodes Comme pour la méthode statique, cette méthode pose des problèmes d implémentation. Le Problème viens du fait que la redéfinition de classe n a pas accès au code courant chargé des classes en mémoire. Il serrai toujours possible d aller chercher le code dans les.class via le ClassPath, mais si les classes ont été modifiés par un instrumenteur, l opération devient très complexe en connaissance des lacunes précédemment énoncées. (UPMC) Instrumentation November 9, 2006 16 / 28
Instrumentation dynamique: Redéfinition de classe Java Réflexion comportemental: Clash des méthodes De plus une classe redéfinies passent par les instrumenteurs de classes! Il faudra donc être vigilant si l on ne veut pas provoquer des effets indésirables. En particulier si l on comptait utiliser ce mécanisme pour désintrumenter une classe. (UPMC) Instrumentation November 9, 2006 17 / 28
Java Inchangé Java Méthode statique L ajout de la possibilité de redéfinir les classes au chargement n apporte rien de plus à l expressivité du langage. Il était possible de le faire en modifiant les.class avant de les charger. (UPMC) Instrumentation November 9, 2006 18 / 28
Java Inchangé Java Méthode dynamique Même sanction pour la redéfinition dynamique. La méthode ne permettant que de changer le corps des méthodes, et le pool d attributs statiques, son action peut être simulé avec le pattern façade. (UPMC) Instrumentation November 9, 2006 19 / 28
Java Inchangé Java Méthode dynamique et statiques combinés La sanction s applique aussi à la combinaison des deux méthodes, car la restriction qui s applique à la redéfinition des classes s applique aussi aux modifieurs de classes qui agissent dynamiquement, si ils modifient des champs non prévu par le mécanisme il feront cracher la JVM. (UPMC) Instrumentation November 9, 2006 20 / 28
Java Méthode statique Autant au niveau théorique, ces ajouts n apportent rien au langage, pour ce qui est de la il n en n est pas de même. En effet les instrumenteurs de classes peuvent lire le code octet avant leur chargement dans la JVM et cet fonctionnalité peut être détourné. Méthode dynamique La méthode dynamique apporte la possibilité de redéfinir les méthodes d une classe au niveau du code octet ce qui ouvre de nouvelles portes pour l optimisation. (UPMC) Instrumentation November 9, 2006 21 / 28
Exemples d applications Java Exemple : sécurité Le fait de pouvoir accéder au code octet et de décider si il est valide permet : Faire du chargement sécurisé avec un protocole de signature des classes (avec les annotations) Instrumenter du code pour les frameworks anti-hack. Exemple : optimisation Recompilation de méthodes optimisées pour un usage. Mise à jours et Debug à la volé. (UPMC) Instrumentation November 9, 2006 22 / 28
Exemples d applications Java Exemple : JPDA Remarque : Toutes ces opérations sont réalisables avec un programme utilisant JPDA. Mais c est très inefficace. (UPMC) Instrumentation November 9, 2006 23 / 28
Sun Corrige les problèmes rencontrés en Java Amélioration du système statique Sun a corriger beaucoup des problèmes de la version dans [Sun06]. 1 La méthode a accès à la politique de sécurité (class loader). 2 Création de deux types d instrumenteurs : Ceux qui supporte la redéfinition de classe. Ceux qui ne le supporte pas. (UPMC) Instrumentation November 9, 2006 24 / 28
Sun Corrige les problèmes rencontrés en Java Amélioration du système dynamique Sun a corriger tout les problèmes techniques de la partie dynamique. 1 On ne passes plus de tableau de classes. 2 Ajouts de choses technique pour les méthodes natives. 3 L utilisation de redefineclass est déconseillé (deprecated?). 4 Ajout de la méthode retransformclass, qui relance les instrumenteurs, qui eux ont accès au code octet! (UPMC) Instrumentation November 9, 2006 25 / 28
Java Réflexion comportementale La réflexion comportementale au niveau des méthodes est apportée par les API de Java depuis. C est pas nouveau Oui mais c était déjà réalisable avec JPDA! [Mou06] (UPMC) Instrumentation November 9, 2006 26 / 28
Java Bibliographie.. Instrumentation et instrospection dans java et 6.0. 2006. SunMicrosystems. Java Platform Debugger Architecture. Sun, 2004. SunMicrosystems. Java 2 Platform Standard Ed.. Sun, 2004. SunMicrosystems. Java Platform, Standard Edition 6 API Specification DRAFT beta2-b86, 2006. (UPMC) Instrumentation November 9, 2006 27 / 28
Questions Java Posez moi la question 1 Pourquoi est ce que tout ça était faisable en JPDA? 2... (UPMC) Instrumentation November 9, 2006 28 / 28