Top Qs
Chronologie
Chat
Contexte
Class (format de fichier)
format de fichier dans le langage de programmation Java De Wikipédia, l'encyclopédie libre
Remove ads
Dans le langage de programmation Java, le code source qui se trouve dans un fichier texte passe par une opération de compilation qui produit un fichier exécutable (voire plusieurs) dont l'extension est .class. Un tel fichier est plus tard chargé en mémoire par le chargeur de classes de n'importe quelle machine virtuelle Java (JVM) afin d'obtenir la définition de la classe lors de l'exécution.
Comme l'un des objectifs de Java est d'être indépendant de la plate-forme, les instructions du code source sont converties en un code spécifique appelé bytecode (et non pas en langage machine de l'ordinateur qui effectue la compilation) qui est stocké dans un fichier de classe portant toujours l'extension .class. Pour garantir l'indépendance de Java par rapport à la plate-forme d'exécution, le format de fichier .class est figé de façon que le résultat de la compilation sur une machine puisse s'exécuter sur n'importe quelle autre.
Remove ads
Structure du fichier
Résumé
Contexte
La convention d'une JVM est de toujours fonctionner en big-endian. Dans les descriptions qui suivent quand un nombre est codé sur 2 octets par exemple l'octet de poids fort sera lu en premier.
Le fichier contient un certain nombre de tables, celles-ci partagent toutes la même structure : un compteur sur 2 octets suivi par un nombre fixe ou variable d'octets pour chaque élément de la table.
Sections
Le fichier est découpé en dix sections (dont la plupart sont de taille variable). Voici leur description dans l'ordre où elles se rencontrent dans un fichier de classe.
Notes :
- les valeurs majeur d'un fichier de classe sont les suivantes : 65 → Java 21, 61 → Java 17, 55 → Java 11, 52 → Java 8, 51 → Java 7, 50 → Java 6, 49 → Java 5.0, 48 → Java 1.4, 47 → Java2 1.3, 46 → Java2 1.2, 45 → Java 1.1 ;
- le format interne d'un nom de classe utilise le caractère '/' comme séparateur en remplacement du caractère '.' utilisé dans le code source Java ;
- si une classe n'a pas de classe parent alors la valeur correspondant à java.lang.Object y est placée ; seule la classe java.lang.Object elle-même n'a pas de classe parent (la valeur est 0 qui n'est pas le numéro d'une constante) ;
- une classe Java ne peut hériter que d'une seule classe parent mais sans limite d'interfaces implémentées d'où l'organisation de ces deux sections.
Constantes
La table des constantes stocke la plupart des valeurs constantes dans la classe (nombres ou textes) ainsi que d'éléments plus évolués (types de données, noms de classes, noms d'attributs…) Chaque constante est décrite par un premier octet codant son type suivi d'un nombre fixe ou variable d'octets selon le type de donnée.
Le compteur de la table des constantes n'est jamais identique au nombre de constantes car pour des raisons historiques leur numérotation commence à 1 (non pas à 0) et de plus deux types de constantes consomment deux numéros au lieu d'un seul.
Les types de constantes suivants sont définis :
Notes :
- le format UTF-8 modifié est inspiré de l'UTF-8 mais utilise la suite 0xC0 0x80 pour représenter le caractère U+0000 et code les caractères U+10000 et suivants sous forme de deux caractères UFT-16 ensuite convertis en UTF-8 ;
- les constantes CONSTANT_Long et CONSTANT_Double occupent deux positions dans la table des constantes ;
- le format interne des types de données utilise :
- une lettre clef pour les types simples (I=int, Z=boolean…),
- 'L<classe>;' pour les types complexes,
- le préfixe '[' devant un type pour introduire une dimension de tableau,
- le caractère '(' pour introduire la signature d'une méthode.
Variables et méthodes
Les membres d'une classe sont décrits par deux tables. Chaque description de membre contient les informations suivantes.
Attributs
La table d'attributs commence comme toutes les tables, par le nombre d'attributs codé sur 2 octets.
Chaque attribut est défini par 2 octets qui pointent vers une CONSTANT_Utf8 fournissant le nom de cet attribut suivi par 4 octets fournissant le nombre d'octets de données de l'attribut (de cette façon si un attribut n'est pas reconnu par une JVM particulière, elle peut facilement l'ignorer).
Selon le contexte d'emploi (attributs de classe, de variable ou de méthode) les attributs peuvent fournir le nom du fichier source, le numéro de ligne source d'une déclaration, etc.
Un attribut essentiel pour une variable final static (une constante) est ConstantValue qui fournit sa valeur.
Un attribut essentiel pour une méthode non abstraite est Code qui contient le bytecode du code Java compilé.
Remove ads
Notes et références
Liens externes
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads