Vous êtes sur la page 1sur 22

MAD – Middleware et JVM

Applications
aDapatables Application

JVM
Application

NT UNIX UNIX

JVM PC PC Sparc

Adaptation de bytecode Abstraction d’un environnement homogène

Cacher l’hétérogénéité des


Sara Bouchenak, Sara.Bouchenak@imag.fr systèmes d’exploitation
systèmes de communication
http://sardes.inrialpes.fr/~bouchena/teaching/MAD/ architectures physiques sous-jacentes

Middleware et Applications aDaptables Introduction 2

Motivations d’un
environnement homogène Plan
1. JVM : une infrastructure middleware
Application Application pour environnements hétérogènes
Qu’est-ce que la JVM ?
JVM
Spécification abstraite
NT UNIX UNIX Mise en œuvre concrète
PC PC Sparc Instance d’exécution

2. Exemple d’illustration
Portabilité des applications, du code 3. BCEL : adaptation de bytecode Java

4. Javassist : adaptation de code Java


Facilité de construction d’applications réparties
5. Synthèse et Références

Middleware et Applications aDaptables Introduction 3 Middleware et Applications aDaptables JVM / Adaptation de bytecode 4
Qu’est-ce que la JVM ? JVM : une des trois entités …
JVM (Java Virtual Machine)
Spécification abstraite
Machine virtuelle
Machine abstraite définie par une spécification Mise en œuvre concrète

Nécessite une mise en œuvre concrète pour


l’exécution des programmes
Instance d’exécution

Middleware et Applications aDaptables 1. JVM 5 Middleware et Applications aDaptables 1. JVM 6

Spécification de la JVM : Spécification de la JVM :


Objectif Objectif
Définition de l’abstraction d’une machine de
Définir calcul :
Ensemble d’instructions
un comportement externe Effectuer des calculs numériques
Contrôler l’accès à la mémoire
commun aux différentes mises en œuvre de la Gérer le contrôle des flots d’exécutions
machine virtuelle Java (processus / threads)
Moyen d’accéder au matériel sous-jacent

Middleware et Applications aDaptables 1. JVM 7 Middleware et Applications aDaptables 1. JVM 8


Spécification de la JVM Types de données (1 / 2)
Comportement de la machine virtuelle en Types références
termes de : Exemples : référence d’instance de classe, de
tableau
Types de données
Types primitifs
Sous-systèmes d’exécution Taille des types spécifiée
Format de codage des types spécifié
Structures de données d’exécution Exemples : int, float, boolean, etc.

Middleware et Applications aDaptables 1. JVM 9 Middleware et Applications aDaptables 1. JVM 10

Types de données (2 / 2) Spécification de la JVM


Type Taille Description

byte 8 bits Comportement de la machine virtuelle en


Types short 16 bits
entiers signés en complément à 2
termes de :
primitifs entiers int 32 bits

long 64 bits

Types float 32 bits Types de données


réels au format IEEE 754
primitifs flottants double 64 bits

Sous-systèmes d’exécution
entier non signé représentant un caractère
char 16 bits
Autres types Unicode

primitifs boolean non spécifié entier 1 pour vrai et entier 0 pour faux

returnAddress non spécifié pointeur vers instruction


Structures de données d’exécution
Types référence vers une instance de classe ou un
reference non spécifié
références tableau

Middleware et Applications aDaptables 1. JVM 11 Middleware et Applications aDaptables 1. JVM 12


Sous-système de chargement
Sous-systèmes d’exécution de classes
Objectif :
S o u s -s y s tè m e Lors de l’exécution d’un programme :
d e c h a rg e m e n t
d e c la s s e s Charger en mémoire les classes et interfaces
utilisées
p ile s d e
zone de ta s p ile s r e g is tr e s
m é th o d e s
Les stocker dans la zone de méthodes de la JVM
m é th o d e s d 'o b je t s Java pc
n a tiv e s
S t r u c t u r e s d e d o n n é e s d 'e x é c u t i o n
Plusieurs chargeurs de classes peuvent
In te r fa c e d e m é th o d e s n a tiv e s cohabiter au sein d’une même JVM
S o u s -s y s tè m e
d 'e x é c u t i o n L ib r a ir ie s d e m é th o d e s Chargeur à partir du CLASSPATH (ClassLoader)
n a t iv e s
Chargeur à partir d’URL (URLClassLoader)
Middleware et Applications aDaptables 1. JVM 13 Middleware et Applications aDaptables 1. JVM 14

Définition d’un nouveau


URLClassLoader chargeur de classes (1 / 2)
URLClassLoader
public URLClassLoader(URL[] urls)

Constructs a new URLClassLoader for the specified URLs using the default
delegation parent ClassLoader. The URLs will be searched in the order specified for For example, an application could create a network class loader to download class files from a server. Sample code might
classes and resources after first searching in the parent class loader. Any URL that look like:
ends with a '/' is assumed to refer to a directory. Otherwise, the URL is assumed to
refer to a JAR file which will be downloaded and opened as needed. ClassLoader loader = new NetworkClassLoader(host, port);
If there is a security manager, this method first calls the security manager's
checkCreateClassLoader method to ensure creation of a class loader is allowed. Object main = loader.loadClass("Main", true).newInstance();
Parameters:
urls - the URLs from which to load classes and resources ...
Throws:
SecurityException - if a security manager exists and its checkCreateClassLoader
method doesn't allow creation of a class loader.
See Also:
SecurityManager.checkCreateClassLoader()

Middleware et Applications aDaptables 1. JVM 15 Middleware et Applications aDaptables 1. JVM 16


Définition d’un nouveau
chargeur de classes (2 / 2) Sous-système d’exécution
class NetworkClassLoader extends ClassLoader {
String host; Mécanisme d’exécution du bytecode contenu
int port;
dans les méthodes des classes chargées
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
Trois formes :
} Spécification abstraite : ensemble d’instructions
private byte[] loadClassData(String name) {
// load the class data from the connection
Mise en œuvre concrète : différentes techniques
...
}
Instance d’exécution : thread Java
}

Middleware et Applications aDaptables 1. JVM 17 Middleware et Applications aDaptables 1. JVM 18

Sous-système d’exécution : Sous-système d’exécution :


Ensemble d’instructions (1 / 4) Ensemble d’instructions (2 / 4)
Compilateur Méthode Java :
Traduit un programme écrit dans un langage source vers un
langage cible suite d’instructions de bytecode
Traditionnellement, le langage cible est le langage d’un
processeur physique
Instruction de bytecode :
Programme compilé compris par toute machine de même
architecture, pas par les autres architectures opcode + un ou plusieurs opérandes

Compilateur Java Opcode :


Traduit un programme écrit dans le langage source Java vers un
langage cible appelé bytecode codé sur un octet (byte)
le langage cible est le langage d’un processeur virtuel (JVM) spécifie l’opération à effectuer
Programme Java compilé compris par toute machine virtuelle, indique s’il est suivi d’un ou plusieurs opérandes
quelle que soit l’architecture physique sous-jacente
indique le type des opérandes

Middleware et Applications aDaptables 1. JVM 19 Middleware et Applications aDaptables 1. JVM 20


Sous-système d’exécution : Sous-système d’exécution :
Ensemble d’instructions (3 / 4) Ensemble d’instructions (4 / 4)
Instructions : approche / structure de pile
Exemples d’opcodes :
iadd val 2

opération d’addition val 1 iadd res

opcode suivi de deux opérandes … …

opérandes de type int


Avant Après
fsub
opération de soustraction Avant l’exécution de iadd
val1, val2 : deux valeurs de type int en sommet de pile
opcode suivi de deux opérandes Exécution de iadd
opérandes de type float val1 et val2 dépilées, additionnées, résultat de type int en
sommet de pile

Middleware et Applications aDaptables 1. JVM 21 Middleware et Applications aDaptables 1. JVM 22

Sous-système d’exécution :
Sous-système d’exécution Mise en œuvre concrète (1 / 5)
Mécanisme d’exécution du bytecode contenu Différentes techniques
dans les méthodes des classes chargées Interprétation

Trois formes : Compilation à la volée (Just-In-Time compiler)


Spécification abstraite : ensemble d’instructions
Optimisation adaptative
Mise en œuvre concrète : différentes techniques
Exécution native
Instance d’exécution : thread Java
Middleware et Applications aDaptables 1. JVM 23 Middleware et Applications aDaptables 1. JVM 24
Sous-système d’exécution : Sous-système d’exécution :
Mise en œuvre concrète (2 / 5) Mise en œuvre concrète (3 / 5)
Interprétation Compilation à la volée / JIT
Seconde génération de JVM
Première génération de JVM Principe
Interprète Java Si appel d’une méthode Java la première fois
loop méthode compilée vers code natif
exécution de la version native
lire une instruction de bytecode
Appel ultérieur de la même méthode Java
la traduire en suite d’instructions-machine correspondant à exécution de la version native
l’architecture sous-jacente
Avantage / Inconvénients
exécuter les instruction machine
☺ Temps d’exécution d’un code natif
Avantage / Inconvénients Surcoût dû à la compilation de méthodes rarement
☺ Simplicité de mise en œuvre appelées (moins coûteux d’exécuter du Java que de
compiler puis exécuter du natif)
Lenteur de l’exécution comparée au code natif
Middleware et Applications aDaptables 1. JVM 25 Middleware et Applications aDaptables 1. JVM 26

Sous-système d’exécution : Sous-système d’exécution :


Mise en œuvre concrète (4 / 5) Mise en œuvre concrète (5 / 5)
Optimisation adaptative Exécution native
Combine l’interprétation Java et la compilation à la volée Principe
Principe Initialement : compilation du programme Java en
Initialement : interprétation Java programme natif
Surveillance de l’exécution : informations sur la fréquence Exécution de tout le programme en version native
d’appel des méthodes
Optimisation adaptative : utilisation des info.s pour choisir Avantage / Inconvénients
les méthodes à compiler puis exécuter en natif
☺ Temps d’exécution d’un code natif
Exemples de JVM proposant l’optimisation adaptative
☺ Pas de surcoût dû à la compilation
JDK 1.3 et + de Sun (HotSpot VM)
Moins de portabilité
Jikes de IBM (Jikes/Jalapeño VM)

Middleware et Applications aDaptables 1. JVM 27 Middleware et Applications aDaptables 1. JVM 28


Sous-système d’exécution :
Sous-système d’exécution Instance d’exécution
Mécanisme d’exécution du bytecode contenu Instance d’exécution de la JVM = thread Java
dans les méthodes des classes chargées
JVM supporte l’exécution de plusieurs
Trois formes : threads (processus légers)
Spécification abstraite : ensemble d’instructions
Rôle du thread
Mise en œuvre concrète : différentes techniques exécuter le code d’une application
bytecode ou code natif
Instance d’exécution : thread Java
Middleware et Applications aDaptables 1. JVM 29 Middleware et Applications aDaptables 1. JVM 30

Structures de données
Spécification de la JVM d’exécution
Comportement de la machine virtuelle en Pour exécuter un programme, la JVM a besoin de
termes de : mémoire pour stocker :
le code des classes utilisées

Types de données les objets instanciés

Sous-systèmes d’exécution les info.s des méthodes exécutées (paramètres, variables


locales, résultat de calculs intermédiaires)

Structures de données d’exécution


la table des symboles utilisés par le programme

Middleware et Applications aDaptables 1. JVM 31 Middleware et Applications aDaptables 1. JVM 32


Structures de données
d’exécution Zone de méthodes (1 / 3)
Une instance de JVM possède une zone de
S o u s -s y s tè m e méthodes partagée par tous les threads de la
d e c h a rg e m e n t
d e c la s s e s JVM
p ile s d e
zone de ta s
d 'o b je t s
p ile s
Java
r e g is tr e s
pc
m é th o d e s Toute classe Java chargée est placée dans
m é th o d e s
S t r u c t u r e s d e d o n n é e s d 'e x é c u t i o n
n a tiv e s
la zone de méthodes

S o u s -s y s tè m e
In te r fa c e d e m é th o d e s n a tiv e s
Tout thread s’exécutant dans la JVM peut
d 'e x é c u t i o n L ib r a ir ie s d e m é th o d e s
n a t iv e s
accéder à toute classe chargée dans cette
JVM
Middleware et Applications aDaptables 1. JVM 33 Middleware et Applications aDaptables 1. JVM 34

Zone de méthodes (2 / 3) Zone de méthodes (3 / 3)


Informations relatives à une classe dans la Informations relatives à une méthode de classe
zone de méthodes dans la zone de méthodes
nom de la méthode
type de son résultat
variables de classes (variables static) types de ses paramètres
ses modificateurs (public, private, protected, static, final,
informations sur les méthodes de la classe synchronized, native, abstract)

constant pool de la classe bytecode de la méthode


Pour une méthode non
table d’exceptions abstract et non native
table des variables locales
Middleware et Applications aDaptables 1. JVM 35 Middleware et Applications aDaptables 1. JVM 36
Constant pool Tas d’objets (1 / 2)
Table de symboles de constantes utilisées par la Une instance de JVM possède un tas
classe
Constante utilisée par une classe participe à la d’objets partagé par tous les threads de la
définitions de : JVM
la classe
variables de classe ou d’instance
descripteur ou code des méthodes Toute instance de classe ou de tableau créée
Forme des constantes est placée dans le tas d’objets
valeurs de chaînes de caractères
valeurs de constantes entières ou flottantes
noms symboliques de classes, interfaces, méthodes, Tout thread s’exécutant dans la JVM peut
variables de classe ou d’instance
accéder à tout objet créé dans cette JVM
Middleware et Applications aDaptables 1. JVM 37 Middleware et Applications aDaptables 1. JVM 38

Tas d’objets (2 / 2) Pile Java


Représentation d’un objet Une pile Java est associée à chaque thread,
valeurs des variable d’instance (attributs de lors de la création du thread
l’objet)
possibilité d’accès aux informations sur la classe Décrit l’état d’avancement des appels de
de l’objet méthodes Java effectués par le thread
référence pointeur vers la
d'objet donnée d'instance
classe
donnée d'instance
donnée d'instance

Tas d'objets L’état d’un appel de méthode est représenté


classe
par une zone appelée frame Java
Zone de méthodes

Middleware et Applications aDaptables 1. JVM 39 Middleware et Applications aDaptables 1. JVM 40


Frame Java Structure d’un frame Java
Table de variables locales
valeurs des paramètres de la méthode
Appel de méthode Java par un thread valeurs des variables locales à la méthode
un nouveau frame Java est créé et empilé sur la Pile d’opérandes
pile Java du thread résultats des calculs intermédiaires effectués lors de l’exécution
de la méthode
manipulation de la pile d’opérandes par : empilement en sommet
Terminaison de méthode Java par un thread de pile ou dépilement de la tête de pile
frame Java associé à cette méthode est dépilé Autres informations
pointeur vers le constant pool de la classe de la méthode
autres informations dépendant de la mise en œuvre de la JVM

Middleware et Applications aDaptables 1. JVM 41 Middleware et Applications aDaptables 1. JVM 42

Frame Java sur pile Java Registre PC


Registre PC (Program Counter)
o p é ra n d e m p ile

o p é ra n d e 1
d ’o p é r a n d e s Lorsque le thread exécute une méthode Java
PC indique l’adresse de la prochaine instruction
F ra m e
de bytecode à exécuter
v a r ia b le n
v a r ia b le s
P ile lo c a le s
v a r ia b le 1 Lorsque le thread exécute une méthode
Java
native
Valeur du PC est indéfinie
Middleware et Applications aDaptables 1. JVM 43 Middleware et Applications aDaptables 1. JVM 44
Méthodes natives vs.
méthodes Java Pile de méthodes natives
Méthode Java Thread Java appelle une méthode native
Écrite dans le langage Java Pile Java du thread laissée de côté
Compilée vers du bytecode Utilisation de la pile de méthodes natives
Stockée dans un fichier .class
Structure de la pile de méthodes natives non définie par la
Méthode native spécification de la JVM
Écrite dans un autre langage que Java (C/C++,
assembleur) E fra m e J a v a
Compilée vers le langage natif de la machine sous-jacente f r a m e n a t if D

Stockée dans une librairie chargée dynamiquement lors de f r a m e n a t if C

l’invocation d’une méthode native par un programme Java B fra m e J a v a

Interface JNI (Java Native Interface) : interaction entre A fra m e J a v a


code Java et code natif P ile d e m é t h o d e s
n a t iv e s
P ile s J a v a

Middleware et Applications aDaptables 1. JVM 45 Middleware et Applications aDaptables 1. JVM 46

Mise en œuvre concrète de la


JVM : une des trois entités … JVM
Plusieurs mises en œuvre de JVM existent
Spécification abstraite Pour plusieurs plates-formes
Mises en œuvre
Mise en œuvre concrète entièrement logicielles
combinaison de mises en œuvre logicielle et
matérielle
Instance d’exécution
Exemples de mises en œuvre de JVM
JDK (J2SDK)
Middleware et Applications aDaptables 1. JVM 47
Kaffe
Middleware et Applications aDaptables 1. JVM 48

picoJava
Exemples de mises en œuvre Exemples de mises en œuvre
concrètes de JVM (1 / 2) concrètes de JVM (2 / 2)
JDK KVM
fourni par Sun une JVM "light" pour terminaux mobiles (téléphones, PDA)
sous-système d’exécution basé sur un interprète, compilation JIT sous-système d’exécution basé sur un interprète
et optimisation adaptative
certaines restrictions par rapport au langage Java / API Java
utilisable sur plusieurs plates-formes : Linux, Solaris, Windows,
Mac OS (types float et double non supportés)
Kaffe
distribuée en logiciel libre JavaCard
sous-système d’exécution basé sur un interprète, compilation JIT une JVM embarquée sur une carte à puce
utilisable sur plusieurs plates-formes : Linux, Solaris, Windows sous-système d’exécution basé sur un interprète
picoJava un sous-ensemble du langage Java et de la JVM
fourni par Sun pas de threads multiples, chargement dynamique de classes
mise en œuvre partiellement matérielle de la JVM
Microprocesseur avec le bytecode pour langage machine

Middleware et Applications aDaptables 1. JVM 49 Middleware et Applications aDaptables 1. JVM 50

JVM : une des trois entités … Instance d’exécution de la JVM


Lorsqu’une application Java est lancée, une instance d’exécution
de la JVM est créée
Spécification abstraite L’application Java s’exécute au sein de cette instance

Instance d’exécution de la JVM commence par l’exécution de la


méthode main d’une classe
Mise en œuvre concrète
Méthode main : point d’entrée pour le lancement du thread initial
de l’application
Instance d’exécution Par la suite, d’autres threads peuvent être créés

Lorsque tous les threads se terminent, l’instance d’exécution de


la JVM se termine
Middleware et Applications aDaptables 1. JVM 51 Middleware et Applications aDaptables 1. JVM 52
Plan Exemple d’illustration
1. JVM : une infrastructure middleware pour Exemple
environnements hétérogènes
Code source Java
2. Exemple d’illustration
Bytecode correspondant
3. BCEL : adaptation de bytecode Java
Exécution et structure de données associées

4. Javassist : adaptation de code Java

Synthèse et Références
Middleware et Applications aDaptables JVM / Adaptation de bytecode 53 Middleware et Applications aDaptables 2. Exemple d'illustration 54
5.

Code source Java Bytecode


c la s s In t V a lu e { v o id a d d ( in t p lu s ) {
0 v a lu e = Compilation
/ / V a r ia b le 1 v a lu e
in t v a lu e ;
2
}
+ p lu s ; javac IntValue.java
// C o n s tru c to r in t s u b ( in t m in u s ) { Génération du fichier IntValue.class
In t V a lu e ( in t in itia lV a lu e ) { 0 a d d ( - m in u s ) ;
v a lu e = in itia lV a lu e ; }
}
// M a in m e th o d
p u b lic s t a t ic v o id m a in (
Désassemblage
// M e th o d s
S t r in g [ ] a r g s ) {
in t g e t In t V a lu e ( ) {
r e tu r n v a lu e ; I n t V a lu e v a l; javap –c IntValue.class
}
0
1
v a l = n e w In tV a lu e ( 5 ) ;
v a l. s u b ( 2 ) ;
Génération du bytecode correspondant
v o id s e t I n t V a lu e ( in t n e w V a lu e ) }
{
v a lu e = n e w V a lu e ; }
}

Middleware et Applications aDaptables 2. Exemple d'illustration 55 Middleware et Applications aDaptables 2. Exemple d'illustration 56
Bytecode Exécution
M e t h o d In tV a lu e (in t ) 2 p u t f ie ld # 7 < F ie ld in t M e th o d v o id s u b (in t)
0 a lo a d _ 0 v a lu e > 0 a lo a d _ 0
1 in v o k e s p e c ia l # 3 5 re tu r n 1 ilo a d _ 1
< M e th o d 2 in e g
M e t h o d v o id m a in (
ja v a . la n g . O b je c t ( ) > 3 in v o k e v ir t u a l # 5
ja v a .la n g .S tr in g [ ])
4 a lo a d _ 0 < M e t h o d v o id
0 n e w # 1 < C la s s
5 ilo a d _ 1 a d d ( in t ) >
I n t V a lu e >
6 p u t f ie ld # 7 < F ie ld in t 6 re tu r n new
v a lu e >
3 dup
4 ic o n s t _ 5 M e th o d v o id a d d (in t)
pile 0 réf
9 re tu r n d’opérandes
5 in v o k e s p e c ia l # 4 0 a lo a d _ 0
M e t h o d in t < M e th o d 1 dup
g e tIn t V a lu e ( ) I n t V a lu e ( in t ) > 2 g e t f ie ld # 7 < F ie ld in t
frame
0 a lo a d _ 0 8 a s to re _ 1 v a lu e > de
1 g e t f ie ld # 7 < F ie ld in t 9 a lo a d _ 1 5 ilo a d _ 1 main
v a lu e > 1 0 ic o n s t _ 2 6 ia d d
4 ir e t u r n 1 1 in v o k e v ir t u a l # 6 7 p u t f ie ld # 7 < F ie ld in t variables 1 ? val 1 ? val
< M e th o d v a lu e > locales
M e t h o d v o id
s e t In tV a lu e (in t )
v o id s u b ( in t ) > 1 0 r e tu rn 0 null args 0 null args
1 4 r e tu rn
0 a lo a d _ 0
1 ilo a d _ 1 (a) (b)
Middleware et Applications aDaptables 2. Exemple d'illustration 57 Middleware et Applications aDaptables 2. Exemple d'illustration 58

Exécution Exécution

2 5
1 réf 1 réf invoke
dup iconst_5 special 0 astore_1
0 réf 0 réf réf

1 ? val 1 ? val 1 ? val 1 réf val

0 null args 0 null args 0 null args 0 null args

(c) (d) (e) (f)


Middleware et Applications aDaptables 2. Exemple d'illustration 59 Middleware et Applications aDaptables 2. Exemple d'illustration 60
Exécution Exécution
pile d’opérandes
invoke
virtual
frame
de
1 2 2
pile 1 1 minus variables sub
aload_1 iconst_2 d’opérandes
0 réf 0 réf 0 réf 0 this
locales

frame
de
main
1 réf val 1 réf val
réf
variables 1 val
0 null args 0 null args locales
0 null args
(g) (h) (i)
Middleware et Applications aDaptables 2. Exemple d'illustration 61 Middleware et Applications aDaptables 2. Exemple d'illustration 62

Exécution Exécution

frame de pile
add d’opérandes

-2 1 pile variables 1 plus = -2 1 pile


réf 0 d’opérandes frame de locales 0 this = réf 0 d’opérandes frame de
sub sub

pile 1 minus = 2 1 variables (PC = 3) pile 1 minus = 2 1 variables (PC = 3)


frame de d’opérandes 0 this = réf 0 locales frame de d’opérandes 0 this = réf 0 locales
main main
(PC = 11) variables (PC = 11) variables 1 val = réf
1 val = réf
locales 0 args = null locales 0 args = null

(j) (k)
Middleware et Applications aDaptables 2. Exemple d'illustration 63 Middleware et Applications aDaptables 2. Exemple d'illustration 64
Exécution Plan
1. JVM : une infrastructure middleware pour
pile 1
d’opérandes 0
5
réf
environnements hétérogènes
frame de
add
(PC = 2) variables 1
locales 0
plus = -2
this = réf
1 pile
0 d’opérandes frame de 2. Exemple d’illustration
sub

pile 1 minus = 2 1 variables (PC = 3)


frame de d’opérandes 0 this = réf 0 locales 3. BCEL : adaptation de bytecode Java
main
(PC = 11) variables 1 val = réf
locales 0 args = null
4. Javassist : adaptation de code Java
(l)

Synthèse et Références
Middleware et Applications aDaptables 2. Exemple d'illustration 65 Middleware et Applications aDaptables JVM / Adaptation de bytecode 66
5.

BCEL : Motivations Exemple


Extension et amélioration des programmes
System.out.println("Hello,
System.out.println("Hello, world");
world");
Java

Manipulation et transformation de bytecode


après la compilation Java
ou lors du chargement dynamique des classes

BCEL fournit une API qui permet de mettre


en œuvre ses propres transformations de
bytecode
Middleware et Applications aDaptables 3. BCEL 67 Middleware et Applications aDaptables 3. BCEL 68
Exemple API de BCEL
Trois parties principales

Package de description statique

Package de modification dynamique

Package d’exemples et d’utilitaires

Middleware et Applications aDaptables 3. BCEL 69 Middleware et Applications aDaptables 3. BCEL 70

API de BCEL :
Package de description statique Exemples de classes
décrit le format des fichiers de classes JavaClass
public String getClassName()
public ConstantPool getConstantPool()
pour la lecture/écriture de fichiers de classes public Field[] getFields()
public Method[] getMethods()
pas pour la modification du bytecode
Method
public LocalVariableTable getLocalVariableTable()
utile pour l’analyse de classes public ExceptionTable getExceptionTable()
principale classe JavaClass
Middleware et Applications aDaptables 3. BCEL 71 Middleware et Applications aDaptables 3. BCEL 72
JavaClass Lecture d’un fichier de classe
JavaClass
JavaClass clazz
clazz == Repository.lookupClass("java.lang.String");
Repository.lookupClass("java.lang.String");
System.out.println(clazz);
System.out.println(clazz);
printCode(clazz.getMethods());
printCode(clazz.getMethods());
...
...
public
public static
static void
void printCode(Method[]
printCode(Method[] methods)
methods) {{
for(int
for(int i=0;
i=0; ii << methods.length;
methods.length; i++)
i++) {{
System.out.println(methods[i]);
System.out.println(methods[i]);
Code
Code code
code == methods[i].getCode();
methods[i].getCode();
if(code
if(code !=
!= null)
null)
//// Non-abstract
Non-abstract method
method
System.out.println(code);
System.out.println(code);
}}
}}
Middleware et Applications aDaptables 3. BCEL 73 Middleware et Applications aDaptables 3. BCEL 74

API de BCEL : Package de


modification dynamique Modification de classe
modification dynamique d’objets JavaClass
ou Method

pour l’insertion de code d’analyse

pour la mise en œuvre de back-end de


compilateur Java

Middleware et Applications aDaptables 3. BCEL 75 Middleware et Applications aDaptables 3. BCEL 76


API de BCEL : Package
d’exemples et d’utilitaires Plan
plusieurs exemples de code utilisant BCEL 1. JVM : une infrastructure middleware pour
environnements hétérogènes

plusieurs utilitaires 2. Exemple d’illustration


viewer de fichier de classe 3. BCEL : adaptation de bytecode Java

outil de conversion d’un fichier de classe en 4. Javassist : adaptation de code Java


HTML
5. Synthèse et Références

Middleware et Applications aDaptables 3. BCEL 77 Middleware et Applications aDaptables JVM / Adaptation de bytecode 78

Javassist : Motivations Javassist : Exemple 1


Manipulation et transformation de programmes Java Modification de l’héritage d’une classe
(idem BCEL)
après la compilation Java ClassPool pool = ClassPool.getDefault();
ou lors du chargement dynamique des classes
CtClass cc = pool.get("test.Rectangle");
BCEL exprime les transformations faites à un
programme Java en bytecode cc.setSuperclass(pool.get("test.Point"));

cc.writeFile();
Javassist exprime les transformations faites à un
programme Java dans le langage source Java
Middleware et Applications aDaptables 4. Javassist 79 Middleware et Applications aDaptables 4. Javassist 80
Javassist : Exemple 2 Javassist : Exemple 3
Définition d’une nouvelle classe Insertion de pré-traitement dans une méthode
public class Hello {
public void say() {
System.out.println("Hello");
ClassPool pool = ClassPool.getDefault(); }
}
CtClass cc = pool.makeClass("Point"); public class Test {
public static void main(String[] args) throws Exception {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("Hello");
CtMethod m = cc.getDeclaredMethod("say");
m.insertBefore("{ System.out.println(\"Hello.say():\"); }");
Class c = cc.toClass();
Hello h = (Hello)c.newInstance(); h.say();
}
}
Middleware et Applications aDaptables 4. Javassist 81 Middleware et Applications aDaptables 4. Javassist 82

Javassist : Exemple 4 Synthèse


Accès aux paramètres d’une méthode JVM
une infrastructure middleware pour
class Point {
int x, y;
environnements hétérogènes
void move(int dx, int dy) {
x += dx; y += dy;
} Adaptation de bytecode
} BCEL : une librairie de manipulation de
ClassPool pool = ClassPool.getDefault();
programmes Java en bytecode
CtClass cc = pool.get("Point");
CtMethod m = cc.getDeclaredMethod("move");
m.insertBefore("{ System.out.println($1); System.out.println($2); }");
Javassist : une librairie de manipulation de
cc.writeFile(); programmes Java en langage source Java

Middleware et Applications aDaptables 4. Javassist 83 Middleware et Applications aDaptables 5. Synthèse et Références 84


Synthèse :
Réflexivité Java, AspectJ, BCEL Synthèse
Réflexivité Java (package java.lang.reflect) Comparaison de BCEL et AspectJ
Accès aux types des paramètres d’une méthode BCEL
public Method[ ] java.lang.Class.getMethods() librairie de bas niveau
public Class[ ] java.lang.reflect.Method.getParameterTypes() manipulation de bytecode
nécessite connaissance de la JVM
AspectJ ☺ permet de construire différents outils de plus haut niveau
Accès aux types et valeurs des paramètres d’une méthode (optimisation des programmes, analyse statique, AOP, etc.)
AspectJ
BCEL technique de plus haut niveau
Accès aux types et valeurs des paramètres et variables locales à abstractions (join points, pointcuts, advices)
une méthode ☺ utilisation plus aisée (ne nécessite pas la connaissance de
la JVM)
mais moins de liberté qu’avec BCEL

Middleware et Applications aDaptables 5. Synthèse et Références 85 Middleware et Applications aDaptables 5. Synthèse et Références 86

Références Web Références bibliographiques


Spécification de la machine virtuelle Java : The Java Virtual Machine Specification (2nd Edition), Tim
Lindholm, Franck Yellin, Addison Wesley, 1999.
http://java.sun.com/docs/books/vmspec/
Inside the Java Virtual Machine, Bill Venners, McGraw-Hill, 2000.

Manipulation de bytecode : Programming for the Java Virtual Machine, Joshua Engel,
Addison-Wesley, 1999
BCEL : http://jakarta.apache.org/bcel/ ou
http://bcel.sourceforge.net/ Java Virtual Machine, Jon Meyer, Troy Downing, O’Reilly &
JikesBT : http://www.alphaworks.ibm.com/tech/jikesbt/ Associates, 1997
Javassist : http://www.csg.is.titech.ac.jp/~chiba/javassist/ Mobilité et Persistance des Applications dans l’Environnement
ASM : http://asm.objectweb.org/ Java – Chapitre 2, Sara Bouchenak, Thèse de Doctorat de l’INPG,
2001.
JOIE : http://www.cs.duke.edu/ari/joie/

Middleware et Applications aDaptables 5. Synthèse et Références 87 Middleware et Applications aDaptables 5. Synthèse et Références 88

Vous aimerez peut-être aussi