Maison >Java >javaDidacticiel >Introduction détaillée au processus de chargement de classe Java

Introduction détaillée au processus de chargement de classe Java

不言
不言avant
2019-03-07 16:49:523247parcourir

Cet article vous apporte une introduction détaillée au processus de chargement des classes Java. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Le processus des fichiers Java depuis l'encodage jusqu'à l'exécution finale :

  1. Compile : Javac Compilez le fichier Java dans un fichier .class
  2. Exécuter : Soumettez le .class file Exécutez le processus de chargement de classe

pour la JVM

La machine virtuelle JVM charge les informations de classe dans le fichier .class dans la mémoire et l'analyse pour générer le fichier correspondant objet de classe. La JVM ne charge pas toutes les classes en mémoire dès le début, mais ne les charge que lorsqu'elle rencontre une classe qui doit être exécutée pour la première fois, et une seule fois.

Introduction détaillée au processus de chargement de classe Java

Chargement

Charger les fichiers de bytecode de classe à partir de diverses sources en mémoire via le chargeur de classe
JVM Trois choses à accomplir

  1. Récupérez le flux d'octets binaires qui définit cette classe par son nom complet.
  2. Structure de stockage statique - > Structure des données d'exécution dans la zone méthode
  3. Génère l'objet java.lang.Class de la classe correspondante dans le tas Java, qui sert de point d'accès pour accéder ces données dans la zone méthode.

Chargeur de classe

  • Démarrer le chargeur de classe
  • Chargeur de classe d'extension
  • Appliquer le chargeur de classe Loader
  • Chargeur de classe personnalisé

Connexion

Le processus de fusion du code binaire de la classe Java dans l'état d'exécution de la JVM

Vérification

Assurez-vous que le flux d'octets chargé est conforme aux spécifications de la machine virtuelle et ne provoquera pas d'erreurs de sécurité

Classification de vérification

  • Vérification du format de fichier, par exemple si la constante Existe-t-il des constantes non prises en charge ? Y a-t-il des informations non standard ou supplémentaires dans le fichier
  • Vérification des métadonnées, par exemple si la classe hérite d'une classe modifiée par final ? Les champs et méthodes de la classe sont-ils en conflit avec la classe parent ? Y a-t-il une surcharge déraisonnable ?
  • La vérification du bytecode garantit la rationalité de la sémantique du programme, par exemple en garantissant la rationalité de la conversion de type.
  • Vérification des références de symboles, par exemple vérifier si la classe correspondante peut être trouvée grâce au nom complet dans la référence de symbole ? Vérifier que l'accessibilité (privée, publique, etc.) dans la référence du symbole est accessible par la classe actuelle ?

Préparation

Allouer de la mémoire pour les variables de classe (attention, pas les variables d'instance) et attribuer des valeurs initiales (les valeurs initiales par défaut de la machine virtuelle Java en fonction de différentes variables types)

Valeur initiale par défaut

  • La valeur initiale de 8 types de base, la valeur par défaut est 0
  • La valeur initiale du type de référence est nulle
  • La valeur initiale de la constante est Pour la valeur définie dans le code
  • final static tmp = 456

Parsing

Le processus de remplacement des références de symboles dans le pool constant avec références directes

Référence de symbole : une chaîne, mais cette chaîne donne des informations pertinentes qui peuvent identifier de manière unique une méthode, une variable ou une classe

Référence directe : peut être comprise comme une adresse mémoire, ou une quantité offset

Par exemple, appelez maintenant la méthode hello(), l'adresse de cette méthode est 1234567, alors hello est une référence symbolique, 1234567 est une référence directe

Pendant la phase d'analyse, la machine virtuelle Les références symboliques des noms de classe, des noms de méthodes et des noms de champs sont remplacées par des adresses mémoire ou des décalages spécifiques, c'est-à-dire des références directes à

initialisation

aux variables de classe (variables ou instructions modifiées par static ) L'initialisation est le processus d'exécution du constructeur de classe

Processus d'initialisation

  • Lors de l'initialisation d'une classe, sa classe parent n'a pas encore été initialisé, puis sa classe parent sera initialisée en premier
    - En même temps Contient plusieurs variables statiques et blocs de code statiques, exécutez-les dans l'ordre descendant

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer