Introduction détaillée au processus de chargement de classe Java de base
Processus de base:
- Chargez le flux d'octets binaires qui définit la classe en fonction du nom entièrement qualifié de la classe.
- Convertir la structure de stockage statique représentée par le flux d'octet en la structure de données d'exécution de la zone de méthode
- Générez un objet java.lang.classe représentant cette classe en mémoire et utilisez-les comme méthode pour accéder à divers portails d'accès aux données de cette classe.
La classe de tableau elle-même n'est pas créée via le chargeur de classe, mais est créée directement par la machine virtuelle Java, et le type d'élément de la classe de tableau est chargé par le chargeur de classe.
Type d'élément Classe de tableau: type de tableau après avoir retiré toutes les dimensions.
Vérification du format de fichier:
- 0xcafeBaby commence par le nombre magique;
- La machine virtuelle actuelle peut gérer le numéro de version primaire et secondaire;
- type constant;
- Type d'exécution d'index;
- type de données encodé UTF8,
Vérification des métadonnées: analyse sémantique de Bytecode Description Informations:
- S'il y a une classe parent;
- Si la classe parent hérite de la classe modifiée finale;
- Si une classe non extraite implémente les méthodes qui doivent être implémentées dans la classe ou l'interface parent;
- Écraser des champs et des méthodes de la classe, surchargez les contradictions;
Vérification du bytecode: Déterminez la légalité et l'exactitude du programme par le flux sémantique et l'analyse du flux de contrôle et la vérification de l'analyse du corps de la méthode.
- Vérification de référence du symbole: Lorsque la machine virtuelle convertit la référence du symbole en référence directe, à l'étape d'analyse, elle effectue une vérification correspondante sur les informations en dehors de la classe elle-même.
- Si la classe correspondante peut être trouvée par des noms pleinement qualifiés décrits par des caractères dans des références symboliques;
- Spécifie s'il existe des descripteurs dans la classe qui correspondent au champ de méthode, ainsi que des méthodes et champs décrits par le nom simple;
- Accessibilité des classes, des champs et des méthodes dans les références symboliques.
Préparation: allouer la mémoire aux variables de classe dans la zone de méthode et définir la valeur initiale des variables de classe.
- La valeur initiale est généralement la valeur zéro du type de données, et la valeur modifiée finale est directement initialisée à la valeur correspondante.
- Les variables de classe sont des variables statiquement modifiées, distinguées des variables d'instance.
Analyse: La machine virtuelle remplace les références symboliques dans le pool constant avec un processus de référence directe
Constant_class_info, constant_fieldref_info, constant_methodref_info ..
- Référence des symboles: un ensemble de symboles décrit la cible référencée. Toute forme de littéraux peut être utilisée pour localiser la cible sans ambiguïté. Cela n'a rien à voir avec l'implémentation de la mémoire de la machine virtuelle et que la cible de référence soit chargée.
- Référence directe: un pointeur directement vers la cible, un décalage ou une poignée qui est indirectement situé à la cible, est lié à la mémoire implémentée par la machine virtuelle. L'objet cible lié à la référence directe doit être chargé.
- . . .
Initialisation: commencez à exécuter le code du programme Java dans la définition de la classe. Exécutez la méthode de constructeur de classe <CINit> (),
<CINit> ():
- Le compilateur collecte automatiquement les actions d'attribution des variables de classe dans la classe en fonction de l'ordre de définition dans le fichier de classe et fusionne les instructions du bloc d'instruction statique. Le bloc d'énoncé statique ne peut accéder qu'aux variables définies auparavant.
- Différent du constructeur de classe, le constructeur de classe parent ne doit pas être appelé comme indiqué. La machine virtuelle garantit que la classe parent <CINit> () a été exécutée avant l'exécution de la sous-classe.
- Le bloc d'instruction statique de la classe parent est en premier exécuté.
- <frinit> () n'est pas nécessaire pour les classes ou les interfaces, et ne sera pas généré s'il n'y a pas d'opération d'attribution de variable ou de bloc d'énoncé statique.
- Le <INIT> () de l'interface n'a pas besoin d'exécuter d'abord le <CINit> () de l'interface parent, et la même classe d'implémentation d'interface <CINit> () n'est pas requise.
- Sécurité du thread: la machine virtuelle garantit que <n cinéma> () est correctement verrouillé et synchronisé dans un environnement multi-thread. Un seul thread peut accéder à la classe <InIt> () de la classe d'initialisation en même temps.
Merci d'avoir lu, j'espère que cela peut vous aider. Merci pour votre soutien à ce site!