Maison  >  Article  >  Java  >  Explication graphique et textuelle détaillée du format de fichier de classe en Java

Explication graphique et textuelle détaillée du format de fichier de classe en Java

黄舟
黄舟original
2017-06-18 09:45:321858parcourir

Pour comprendre la JVM et une compréhension approfondie du langage Java, l'apprentissage et la compréhension du format des fichiers de classe sont des leçons essentielles

La position et le rôle des fichiers de classe dans Java architecture

Pour comprendre la JVM et une compréhension approfondie du langage Java, l'apprentissage et la compréhension du format des fichiers de classe sont autant de tâches qu'il faut maîtriser. La raison est très simple. La JVM ne comprendra pas les fichiers sources Java que nous écrivons. Nous devons compiler les fichiers sources Java en fichiers de classe avant qu'ils puissent être reconnus par la JVM. Pour la JVM, le fichier de classe est équivalent à une interface. Comprendre cette interface peut nous aider à mieux comprendre le comportement de la JVM ; d'un autre côté, le fichier de classe re-décrit le sens que nous voulons exprimer dans le fichier source d'une autre manière. Comprendre comment le fichier de classe re-décrit le fichier source. nous avons écrit, car une compréhension approfondie du langage et de la grammaire Java est très utile. De plus, quel que soit le langage, tant qu'il peut être compilé dans un fichier de classe, il peut être reconnu et exécuté par la JVM. Par conséquent, le fichier de classe n'est pas seulement la base du multiplateforme, mais aussi la base. base de JVM multilingue. Comprendre le format de fichier de classe est très important pour nous, apprendre sur la base de JVM d'autres langages serait d'une grande aide.

En bref, dans toute l'architecture technologique Java, les fichiers de classe sont au milieu et jouent un rôle de connexion dans la compréhension de l'ensemble du système. Comme le montre la figure :

Aperçu du format de fichier de classe

le fichier de classe est un Il s'agit d'un fichier de flux binaire de 8 bits, chaque élément de données est organisé de manière serrée d'avant en arrière, sans aucun espace entre les éléments adjacents. Cela rend le fichier de classe très compact, léger et peut être rapidement chargé en mémoire par la JVM. prend moins d'espace mémoire. Une fois nos fichiers sources Java compilés, chaque classe (ou interface) occupe un fichier de classe distinct, et toutes les informations de la classe auront des descriptions correspondantes dans le fichier de classe. Les fichiers de classe étant très flexibles, ils sont encore plus flexibles que les sources Java. les fichiers ont des capacités de description plus fortes.

Les informations dans le fichier de classe sont classées une par une. Chaque élément de données a sa longueur fixe, certaines occupent un octet, certaines occupent deux octets et certaines occupent quatre octets ou 8 octets, les différentes longueurs. des éléments de données sont représentés respectivement par u1, u2, u4, u8, qui indiquent respectivement qu'un élément de données occupe un octet, deux octets, 4 octets et 8 octets dans le fichier de classe. Vous pouvez considérer u1, u2, u3 et u4 comme les « types » d’éléments de données de fichiers de classe. Les éléments de données suivants existent dans le

fichier de classe (ce graphique est référencé à partir de "Machine virtuelle Java en profondeur") :

Type

Nom

Quantité

u4

magie

1

u2

version_mineure

1

u2

major_version

1

u2

constant_pool_count

1

cp_info

constant_pool

constant_pool_count - 1

u2

access_flags

1

u2

this_class

1

u2

super_class

1

u2

interfaces_count

1

u2

interfaces

interfaces_count

u2

fields_count

1

field_info

champs

fields_count

u2

methods_count

1

method_info

méthodes

methods_count

u2

attribute_count

1

attribute_info

attributs

attributes_count


Ce qui suit est une explication détaillée de chaque élément du dossier de classe.

Le numéro magique et le numéro de version dans le fichier de classe

(1) magique

est au début du fichier classe Les quatre octets stockent le numéro magique du fichier classe. Ce numéro magique est le symbole du fichier classe. C'est une valeur fixe : 0XCAFEBABE. En d'autres termes, c'est la norme pour juger si un fichier est au format classe. Si les quatre premiers octets ne sont pas 0XCAFEBABE, cela signifie qu'il ne s'agit pas d'un fichier classe et qu'il ne peut pas être reconnu par la JVM.

(2) minor_version et major_version

Les quatre octets qui suivent le nombre magique sont le numéro de version et le numéro de version majeure du fichier de classe. Au fur et à mesure du développement de Java, le format des fichiers de classe subira également des modifications correspondantes. Le numéro de version indique quand le fichier de classe a été ajouté ou modifié. Par exemple, les numéros de version des fichiers de classe compilés par différentes versions du compilateur javac peuvent être différents, et les numéros de version des fichiers de classe reconnus par différentes versions de JVM peuvent également être différents. Généralement, une version supérieure de la JVM peut reconnaître un. version inférieure. Les fichiers de classe compilés par le compilateur javac, mais la version inférieure de la JVM ne peut pas reconnaître les fichiers de classe compilés par la version supérieure du compilateur javac. Si vous utilisez une version inférieure de la JVM pour exécuter une version supérieure du fichier de classe, la JVM lancera java.lang.UnsupportedClassVersionError. Les changements spécifiques aux numéros de version ne seront pas abordés ici, et les lecteurs qui en ont besoin peuvent consulter les informations par eux-mêmes.

Constante dans le fichier de classeAperçu du pool

Dans le fichier de classe, le pool de constantes est situé après la version nombre d'éléments de données liés. Le pool constant est une donnée très importante dans le fichier de classe. Le pool de constantes stocke le texte chaîne , la valeur constante, le nom de classe de la classe actuelle, le nom du champ, le nom de la méthode, les descripteurs de chaque champ et méthode, les informations de référence sur les champs et méthodes de la classe actuelle, la référence actuelle. des informations aux autres classes de la classe, etc. Le pool de constantes contient des descriptions de presque toutes les informations de la classe. De nombreuses autres parties du fichier de classe sont des références à des éléments de données du pool de constantes, telles que this_class, super_class, field_info,attribut_info, etc. octets Il existe également une référence au pool de constantes dans l'instruction de code. Cette référence au pool de constantes est utilisée comme opérande de l'instruction de bytecode. De plus, chaque élément du pool constant fera également référence les uns aux autres.

La valeur de constant_pool_count dans le fichier de classe est 1, indiquant que chaque classe n'a qu'un seul pool de constantes. Les données du pool constant sont également déchargées une par une sans interruption. Chaque élément de données du pool constant est accessible via index, ce qui est quelque peu similaire à un tableau, sauf que l'index du premier élément du pool constant est 1, et non 0, s'il est référencé ailleurs dans le fichier de classe Un élément de pool constant avec l'index 0 signifie qu'il ne fait référence à aucun élément de pool constant. Chaque élément de données du fichier de classe a son propre type. De la même manière, chaque élément de données du pool de constantes a également son propre type. Les types d'éléments de données dans le pool constant sont les suivants :

常量池中数据项类型

类型标志

类型描述

CONSTANT_Utf8

1

UTF-8编码的Unicode字符串

CONSTANT_Integer

3

int类型字面值

CONSTANT_Float

4

float类型字面值

CONSTANT_Long

5

long类型字面值

CONSTANT_Double

6

double类型字面值

CONSTANT_Class

7

对一个类或接口的符号引用

CONSTANT_String

8

String类型字面值

CONSTANT_Fieldref

9

对一个字段的符号引用

CONSTANT_Methodref

10

对一个类中声明的方法的符号引用

CONSTANT_InterfaceMethodref

11

对一个接口中声明的方法的符号引用

CONSTANT_NameAndType

12

对一个字段或方法的部分符号引用

Type d'élément de données moyen de pool constant
Drapeau de type Description du type
CONSTANT_Utf8 1 UTF -8 Chaîne Unicode codée
CONSTANT_Entier 3 valeur littérale de type int
CONSTANT_Float 4 valeur littérale de type flottant
CONSTANT_Long 5 littéral de type long
CONSTANT_Double 6 littéral de type double
CONSTANT_Class 7 Une référence symbolique à une classe ou une interface
CONSTANT_String 8 Type de chaîne Valeur littérale
CONSTANT_Fieldref 9 Une symbolique référence à un champ
CONSTANT_Methodref 10 Une référence symbolique à une méthode déclarée dans une classe
CONSTANT_InterfaceMethodref 11 Référence symbolique à une méthode déclarée dans une interface
CONSTANT_NameAndType 12 Référence symbolique partielle à un champ ou une méthode

Chaque élément de données est appelé un élément XXX_info. Par exemple, un élément de type CONSTANT_Utf8 dans un pool constant est un CONSTANT_Utf8_info. De plus, chaque élément d'information a une valeur d'indicateur (balise). Cette valeur d'indicateur indique le type de l'élément d'information dans ce pool constant, comme le montre le tableau ci-dessus, la valeur de la balise dans un CONSTANT_Utf8_info. est 1 et la valeur de la balise dans un CONSTANT_Fieldref_info est 9.

Les programmes Java sont liés dynamiquement. Dans la mise en œuvre de la liaison dynamique, le pool constant joue un rôle crucial. En plus de stocker certains littéraux, le pool de constantes stocke également les types de références de symboles suivants :

(1) Noms complets de classes et d'interfaces

(2 ) Noms et descripteurs de champs

(3) Noms et descripteurs de méthodes

Avant d'expliquer en détail chaque élément de données du pool constant, nous devons d'abord en savoir plus sur le caractère spécialchaîne dans le fichier de classe, car dans le pool de constantes, les chaînes spéciales apparaissent en grand nombre. Ces chaînes spéciales sont les noms et descripteurs complets mentionnés ci-dessus. Pour comprendre chaque élément de données du pool constant, vous devez d’abord comprendre ces chaînes spéciales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn