[Java] chargement de classe et création d'objet en java

Mécanisme de chargement de classe JAVA

Le chargement des classes Java est divisé en 5 processus, à savoir: chargement, connexion (vérification, préparation, analyse), initialisation, utilisation et déchargement.

  1. Chargement Le
    chargement consiste principalement à lire des fichiers .class (ou des packages zip) dans la JVM via un flux d'octets binaires. Dans la phase de chargement, la JVM doit effectuer 3 choses:
    1) Obtenez le fichier XXX.class à partir du chemin d'accès aux classes via le chargeur de classes et lisez-le dans la mémoire sous la forme d'un flux binaire.
    2) Convertir la structure de stockage statique représentée par le flux d'octets dans la structure de données d'exécution de la zone de méthode;
    3) Générer un objet java.lang.Class de cette classe dans la mémoire pour accéder à diverses données de cette classe dans la zone de méthode Entrée.

2.1 Vérification
Principalement pour s'assurer que le flux d'octets chargé est conforme à la spécification JVM. La phase de vérification complétera les 4 phases suivantes des actions d'inspection:
1) Vérification du format de fichier
2) Vérification des métadonnées (si elles sont conformes à la spécification du langage Java)
3) Vérification du bytecode (déterminer que la sémantique du programme est légale et logique)
4) Vérification de la référence des symboles ( (Assurez-vous que l'analyse suivante peut être exécutée normalement)
2.2 Préparation La
préparation est la deuxième étape de la phase de connexion, qui alloue principalement de la mémoire pour les variables statiques dans la zone de méthode et définit la valeur initiale par défaut.
2.3 Résolution La
résolution est la troisième étape de la phase de connexion, qui est le processus dans lequel la machine virtuelle remplace les références de symboles dans le pool de constantes par des références directes.

  1. Initialisation La
    phase d'initialisation est la dernière étape du processus de chargement de classe, qui consiste principalement à affecter activement des valeurs aux variables de classe en fonction des instructions d'affectation du programme.
    Lorsqu'il existe une relation d'héritage, la classe parente est initialisée en premier, puis la classe enfant est initialisée. Par conséquent, lorsqu'une classe enfant est créée, il y a en fait deux instances d'objet dans la mémoire.
    Remarque: Si la relation d'héritage de la classe est trop longue, compte tenu de l'initialisation de classe seule, cette conception n'est pas préférable. Je pense que vous avez deviné la raison.
    Il est généralement recommandé que la relation d'héritage de classe ne dépasse pas au plus trois niveaux, à savoir parent-enfant-petit-enfant. Dans certains scénarios d'application spéciaux, la couche 4 peut être ajoutée, mais arrêtez-vous là, la couche 4 présente déjà des défauts de conception de code.
  2. Utilisez
    des appels mutuels entre les programmes.
  3. Le déchargement
    signifie la destruction d'un objet, ce qui est généralement effectué par le garbage collector JVM. La destruction au niveau du code définit simplement la référence sur null.

Après avoir passé l'introduction générale ci-dessus, regardons l'analyse d'exécution de Singleton2.getInstance ():
1) Chargement de classe. Exécutez Singleton2.getInstance (), JVM n'a pas trouvé les informations relatives à la classe Singleton pour la première fois. Le fichier Singleton.class est donc chargé dans la mémoire via le chargeur de classe.
2) Vérification de classe.
3) La préparation pour la classe est omise . Convertissez les ressources statiques de Singleton2 en zone de méthode. Value1, value2 et singleton sont initialement déclarés comme 0, 0 et null dans la zone de méthode.
4) Analyse de classe. Omettre (le processus de remplacement des références de symboles dans le pool de constantes par des références directes)
5) Initialisation de la classe. Effectuer l'attribution des propriétés statiques. Premier ordre value1 = 5, value2 = 3, suivi de Private static Singleton2 singleton2 = new Singleton2 ( );
cette opération consiste à créer des objets, selon les conclusions 1 avant d'exécuter le constructeur Singleton2, allez à effectuer des ressources de ressources statiques et non statiques . Mais comme valeur1 et valeur2 ont été initialisées, la prochaine exécution est la ressource non statique, et enfin la méthode de construction de Singleton2: valeur1 ++; valeur2 ++.
Donc Singleton2 donne 6 et 4.

En plus de clarifier l'ordre d'exécution, il y a un autre point important -> Conclusion 2: Les ressources statiques ne seront exécutées qu'une seule fois lors de l'initialisation de la classe . À ne pas confondre avec la troisième étape.

Avec la conclusion ci-dessus, regardons l'analyse d'exécution de Singleton.getInstance ():
1) Chargement de classe. Chargez la classe Singleton en mémoire.
2) Vérification de classe.
3) La préparation pour la classe est omise . Convertissez les ressources statiques de Singleton2 en zone de méthode.
4) Analyse de classe. Omettre (le processus de remplacement des références de symboles dans le pool de constantes par des références directes)
5) Initialisation de la classe. Effectuer l'attribution des propriétés statiques. Singleton singleton statique privé de premier ordre = nouveau Singleton ( ), selon les conclusions 1 et les conclusions 2, n'effectue pas l'affectation de cette couche d'opération, valeur1 et valeur2. Par conséquent, value1 et value2 dans l'objet singleton ne sont que des opérations ++ sur la base de 0. À ce stade, valeur1 = 1 et valeur2 = 1 dans l'objet singleton.
Ensuite, public static int value1 = 5; public static int value2 = 3; Ces deux lignes de code effectuent en fait l'opération d'affectation. Donc le résultat final: 5 et 3.
Si l'implémentation est public static int value1; public static int value2; quel sera le résultat? Résultat: 1 et 1.

Remarque: pourquoi Singleton singleton = new Singleton () n'attribue pas valeur1, valeur2? Car l'affectation des variables statiques ne se fait qu'une seule fois lors de l'initialisation de la classe.
Lorsque le programme exécute singleton statique privé Singleton = new Singleton (), il affecte déjà des valeurs aux variables statiques de la classe Singleton. Ici, new Singleton () est une affectation spéciale, similaire à la couche interne récursive, la couche externe est déjà une opération d'affectation, donc la couche interne filtrera automatiquement l'opération d'affectation des variables statiques. Mais les variables non statiques seront toujours attribuées.

Conclusion 3: Sur la base de la conclusion 2, les ressources non statiques seront initialisées avec la création de l'objet. Chaque fois qu'un objet est créé, une initialisation est effectuée.

La maîtrise des conclusions 1, 2 et 3 est essentiellement familière avec l'ordre d'exécution des programmes dans les classes Java. Cela ne suffit pas, ClassLoader n'a pas encore été introduit.

Chargeur de classe

JVM fournit les trois chargeurs de classe système suivants:

  • Bootstrap ClassLoader : le chargeur de classe de niveau supérieur est responsable du chargement du répertoire JAVA_HOME \ lib ou dans le chemin spécifié par le paramètre -Xbootclasspath, et est reconnu par la machine virtuelle (identifiée par le nom de fichier, tel que rt.jar )le type.
  • Extension ClassLoader : Responsable du chargement de la bibliothèque de classes dans le répertoire JAVA_HOME \ lib \ ext ou dans le chemin spécifié par la variable système java.ext.dirs.
  • Application ClassLoader : également appelé chargeur de classe système, il peut être obtenu via getSystemClassLoader (), et est responsable du chargement de la bibliothèque de classes sur le chemin utilisateur (chemin de classe). S'il n'y a pas de chargeur de classe personnalisé, il s'agit généralement du chargeur de classe par défaut.

Création d'objets:

img

Clause de non-responsabilité: Ce billet de blog est une note d'étude et fait référence à certaines ressources du réseau. En cas d'infraction, veuillez nous en informer par message privé!

Je suppose que tu aimes

Origine blog.csdn.net/qq_42380734/article/details/105397532
conseillé
Classement