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