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 :

Les entrailles d'un fichier \

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 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 :

(Voir la liste des bytecodes disponible trier par
nom et par valeur)