Instrumentation et réflexivité en Java 5.0 et 6.0

publicité
Instrumentation
5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Instrumentation et réflexivité
en Java 5.0 et 6.0
Apports
pratiques
Applications
Alix Mougenot
Java 6.0
Conclusion
UPMC
Questions ?
November 9, 2006
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
1 / 28
Instrumentation
5.0
Petit Plan
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Plan de ce cour
1
Présentation de l’Instrumentation
2
Apports
théoriques
Présentation de la nouvelle API 5.0
3
Partie Instrumentation Statique
Apports
pratiques
4
Partie Instrumentation Dynamique
5
Apports Théoriques
6
Apports Pratiques
7
Applications
8
Présentation des changements en 6.0
9
Conclusions
10
Questions
Applications
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
2 / 28
Instrumentation
5.0
Instrumentation : Définition
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Instrumentation
Définition : Est considéré comme instrumentation toute
opération visant à modifier un programme pour en suivre le
comportement.
Java 6.0
Conclusion
Exemples : debug, monitoring, couverture de code, profiling.
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
3 / 28
Instrumentation
5.0
Instrumentation : Avant Java 5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
API précédentes
Il est à noter qu’avant l’API 5.0, 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.
Questions ?
La couverture de code n’était pas gérée du tout.
Le profiling n’était pas gérer du tout.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
4 / 28
Instrumentation
5.0
Instrumentation : Avant Java 5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
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.
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
5 / 28
Instrumentation
5.0
Apports de Java 5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
API
L’API de Java 5.0 [Sun04b] apporte un nouveau package :
java.lang.intrument qui contient deux services.
Un service d’instrumentation statique,
ClassFileTransformer
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
6 / 28
Instrumentation
5.0
Instrumentation statique: Class File Transformer
Alix
Mougenot
Introduction
API
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Un Class File Transformer est une classe qui implante :
byte[] transform(ClassLoader loader,
String className,
Class<?> ClassBeingRedefined,
byte[] classBuffer)
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
7 / 28
Instrumentation
5.0
Instrumentation statique: Class File Transformer
Alix
Mougenot
Introduction
Mise en place
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Le paquet : java.lang.intrument permet l’ajout ou le retrait des
Class File Transformer :
void addTransformer(
ClassFileTransformer transformer)
Java 6.0
Conclusion
Questions ?
boolean removeTransformer(
ClassFileTransformer transformer)
La partie statique du paquet instrumentation sert donc au
chargement et au déchargement des instrumenteurs.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
8 / 28
Instrumentation
5.0
Instrumentation statique: Class File Transformer
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
9 / 28
Instrumentation
5.0
Instrumentation statique: Class File Transformer
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
10 / 28
Instrumentation
5.0
Instrumentation statique: Class File Transformer
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
11 / 28
Instrumentation
5.0
Instrumentation statique: Conclusion
Alix
Mougenot
Introduction
une implémentation périlleuse
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
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).
Applications
Avec des problèmes d’implémentation et de visibilité.
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
12 / 28
Instrumentation
5.0
Instrumentation dynamique: Redéfinition de classe
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
API
le paquet java.lang.instrument propose une méthode pour
redéfinir un lot de classes :
void redefineClasses(ClassDefinition[] definitions)
Java 6.0
Conclusion
Questions ?
Sachant qu’une ClassDefinition est un couple (class,byte[]). Ici
encore on doit pouvoir fournir du code octet valide
représentant une classe.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
13 / 28
Instrumentation
5.0
Instrumentation dynamique: Redéfinition de classe
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
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,
Applications
enlever des champs à une classe,
Java 6.0
ajouter des méthodes,
Conclusion
les retirer,
Questions ?
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 5.0 de
la machine virtuelle.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
14 / 28
Instrumentation
5.0
Instrumentation dynamique: Redéfinition de classe
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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. . .
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
15 / 28
Instrumentation
5.0
Instrumentation dynamique: Redéfinition de classe
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
16 / 28
Instrumentation
5.0
Instrumentation dynamique: Redéfinition de classe
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
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.
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
17 / 28
Instrumentation
5.0
Java Inchangé
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Méthode statique
Apports
pratiques
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.
Applications
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
18 / 28
Instrumentation
5.0
Java Inchangé
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Méthode dynamique
Apports
pratiques
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.
Applications
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
19 / 28
Instrumentation
5.0
Java Inchangé
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
20 / 28
Instrumentation
5.0
Apports pratiques
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Java 6.0
Méthode statique
Autant au niveau théorique, ces ajouts n’apportent rien au
langage, pour ce qui est de la pratiques 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é.
Conclusion
Questions ?
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.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
21 / 28
Instrumentation
5.0
Exemples d’applications
Alix
Mougenot
Introduction
Exemple : sécurité
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
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)
Applications
Instrumenter du code pour les frameworks anti-hack.
Java 6.0
Conclusion
Questions ?
Exemple : optimisation
Recompilation de méthodes optimisées pour un usage.
Mise à jours et Debug à la volé.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
22 / 28
Instrumentation
5.0
Exemples d’applications
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Applications
Exemple : JPDA
Remarque : Toutes ces opérations sont réalisables avec un
programme utilisant JPDA. Mais c’est très inefficace.
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
23 / 28
Instrumentation
5.0
Sun Corrige les problèmes rencontrés en 5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Amélioration du système statique
Sun a corriger beaucoup des problèmes de la version 5.0 dans
Java 6.0 [Sun06].
1
Applications
Java 6.0
Conclusion
Questions ?
2
La méthode a accès à la politique de sécurité (class
loader).
Création de deux types d’instrumenteurs :
I
I
Alix Mougenot (UPMC)
Ceux qui supporte la redéfinition de classe.
Ceux qui ne le supporte pas.
Instrumentation 5.0
November 9, 2006
24 / 28
Instrumentation
5.0
Sun Corrige les problèmes rencontrés en 5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Amélioration du système dynamique
Sun a corriger tout les problèmes techniques de la partie
dynamique.
Apports
pratiques
1
On ne passes plus de tableau de classes.
Applications
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!
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
25 / 28
Instrumentation
5.0
Conclusion
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Réflexion comportementale
La réflexion comportementale au niveau des méthodes est
apportée par les API de Java depuis 5.0.
Applications
C’est pas nouveau
Java 6.0
Conclusion
Questions ?
Oui mais c’était déjà réalisable avec JPDA ! [Mou06]
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
26 / 28
Instrumentation
5.0
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Bibliographie.
Alix Mougenot.
Instrumentation et instrospection dans java 5.0 et 6.0.
2006.
SunMicrosystems.
Java Platform Debugger Architecture.
Sun, 2004.
Applications
Java 6.0
Conclusion
Questions ?
SunMicrosystems.
Java 2 Platform Standard Ed. 5.0.
Sun, 2004.
SunMicrosystems.
Java Platform, Standard Edition 6 API Specification
DRAFT beta2-b86, 2006.
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
27 / 28
Instrumentation
5.0
Questions
Alix
Mougenot
Introduction
Java 5.0
Statique
Dynamique
Apports
théoriques
Apports
pratiques
Posez moi la question
1
Pourquoi est ce que tout ça était faisable en JPDA ?
2
...
Applications
Java 6.0
Conclusion
Questions ?
Alix Mougenot (UPMC)
Instrumentation 5.0
November 9, 2006
28 / 28
Téléchargement