Dex Format vs Java bytecode
Java ".class" Format
Qu'est ce que c'est?
Les fichiers .class
correspondent au fichier exécutable par une machine virtuelle
Java. Ces fichiers résultent de la compilation de ligne de code Java contenues dans un
fichier source (fichier .java
).
Chaque fichier compiler contient les informations d'exécution pour une classe seulement.
On y retrouve les instructions du fichier source sous forme de bytecode compressible
par toutes les machines virtuelle Java.
Dans la suite de cette page nous verrons la structure interne de ce fichier.
Structure interne
Les fichiers .class
contient du bytecode mais aussi plusieurs informations
permettant l'exécution du programme.
Voici un schéma détaillant les sections dans lesquelles nous pouvons retrouver informations utile
à l'exécution :

Nous allons donner significations des informations que l'on retrouve dans chaque section
(pour plus de détails voir la
spécification)
d'un fichier .class
.
Le numéro magique
Le nombre magique permet d'identifier les fichiers d'execution Java.
Pour informations, la valeur de ce champs est 0xCAFEBABE.
La version du fichier d'execution
Renseigne sur la version du fichier d'execution.
Si ce dernier est supérieur à la version de la machine virtuelle, celle-ci ne le
l'exécutera pas.
Le réservoir à constante
Le réservoir à constante correspond à une table ou sont représenter toutes les constantes de la classe. Ces constantes peuvent avoir différent type :
- Les constantes de chaine de caractère : Renseigne sur une méthode de la classe
- Le type
Class
: Renseigne sur une classe référencée dans le fichier dont il est question - Le type
Fieldref
: Renseigne sur un champs de la classe - Le type
Methodref
: Renseigne sur une méthode de la classe - Le type
InterfaceMethodref
: Renseigne sur une méthode de l'interface que la classe implémente -
Le type
String
: Renseigne sur une chaine de caractère dans le fichier. Cette String est un objet représentant réellement une chaine de caractère. - Le type
Integer
: Renseigne sur un nombre entier présent dans le fichier. - Le type
Float
: Renseigne sur un nombre réel présent dans le fichier. - Le type
Long
: Renseigne sur un nombre entier long présent dans le fichier. - Le type
Double
: Renseigne sur un nombre réel long présent dans le fichier. -
Le type
NameAndTyppe
: Renseigne sur un champ ou une méthodes sans indiquer de quelle classe ou de quelle interface il dépend. -
Le type
utf8
: Renseigne sur un valeur de type chaine de caractère et qui ce trouve dans le fichier. Cette chaine de caractère peut être le nom d'une méthode, d'un champs, etc.
Les drapeaux d'accessibilité
Donne le type de permission d'accès de la classe décrite dans le fichier (ou de l'interface).
Nom de la classe
Renseigne le nom de la classe dont il est question.
Nom de la super classe
Renseigne le nom de la super classe de la classe dont il est question.
Interfaces
Renseigne le nom des interfaces que la classe dont il est question implémente (si implémentation il y a).
Les champs
Table gérant les champs présents dans la définition de la classe dont il est question. Chaque champs est décrit par un champs d'accessibilité, un nom, un descripteur (type) et ces attributs (si attribut il y a).
les méthodes
Table gérant les méthodes présentes dans la définition de la classe dont il est question. Chaque méthodes est décrite par un champs d'accessibilité, un nom, un descripteur (type des paramètres et de retour) et ces attributs (si attribut il y a).
Les attributs
Table gérant les attributs présent dans la définition de la classe dont il est question.
Le Bytecode Java
Le bytecode est un code intermédiaire qui est comprit et exécutable par une machine virtuelle Java. Ce code est représenté sur 8 bites, ce qui revient à allouer un maximum théorique de 256 bytecodes. Cependant, toutes ce possibilité de codage ne sont pas utilisé pour des raisons historiques, pour les debuggers ou pour de future amélioration du langage Java. Le choix du bytecode pour la compilation Java s'explique par :
- La transportabilité du code : le bytecode est transportable sur différente architecture.
- La rapidité d'exécution : le bytecode est plus rapide à exécuter que du code source.