Maison  >  Article  >  Java  >  Quel est le mécanisme de chargement des classes Java ?

Quel est le mécanisme de chargement des classes Java ?

(*-*)浩
(*-*)浩original
2019-05-21 18:20:4318218parcourir

Cet article présentera les étapes du mécanisme de chargement de classe de Java. Veuillez consulter les détails suivants.

Quel est le mécanisme de chargement des classes Java ?

Mécanisme de chargement de classe

Une classe commence par être chargée dans la mémoire de la machine virtuelle jusqu'à ce qu'elle soit déchargée de la mémoire. Le cycle de vie comprend sept étapes : chargement, vérification, préparation, résolution, initialisation, utilisation et déchargement. Les trois parties de vérification, de préparation et d'analyse sont collectivement appelées liaison. La séquence de ces sept étapes est illustrée dans la figure ci-dessous :

Quel est le mécanisme de chargement des classes Java ?

Moment du chargement de la classe <.>

Référence active : une fois qu'une classe est activement référencée, le processus d'initialisation sera déclenché (le chargement, la vérification et la préparation doivent commencer avant)

1) Lors de la rencontre de nouveaux, getstatic, putstatic ou Lors de l'utilisation des quatre instructions de bytecode de Invokestatic, si la classe n'a pas été initialisée, son initialisation doit d'abord être déclenchée. Les scénarios de code Java les plus courants qui génèrent ces quatre instructions sont les suivants : lors de l'utilisation du mot-clé new pour instancier un objet, la lecture ou la définition des champs statiques d'une classe (à l'exception des champs statiques modifiés par final et placés dans le pool de constantes par le compilateur) ), et lors de l’appel d’une méthode statique d’une classe.

2) Lorsque vous utilisez la méthode du package java.lang.reflect pour effectuer un appel réflexif à une classe, si la classe n'a pas été initialisée, son initialisation doit d'abord être déclenchée.

3) Lors de l'initialisation d'une classe, si vous constatez que sa classe parent n'a pas été initialisée, vous devez déclencher l'initialisation de la classe parent.

4) Lorsque la machine virtuelle démarre, l'utilisateur doit spécifier une classe principale à exécuter (la classe contenant la méthode main()), et la machine virtuelle initialisera d'abord cette classe.

5) Lors de l'utilisation du support du langage dynamique de jdk7+, si le résultat final de l'analyse de l'instance java.lang.invoke.MethodHandle est le handle de méthode de REF_getStatic, REF_putStatic, REF_invokeStatic et la classe correspondant à cette méthode le handle n'a pas été initialisé. L'initialisation nécessite d'abord l'initialisation du déclencheur.

Référence passive : Si une classe est une référence passive, la classe ne déclenchera pas le processus d'initialisation

1) Faire référence aux champs statiques de la classe parent via la sous-classe ne provoquera pas la sous-classe à initialiser. Pour les champs statiques, seule la classe qui définit directement le champ sera initialisée, donc lorsque l'on fait référence au champ statique défini dans la classe parent via une sous-classe, seule l'initialisation de la classe parent sera déclenchée, pas l'initialisation de la sous-classe. .

2) Faire référence à une classe via une définition de tableau ne déclenchera pas l'initialisation de cette classe.

3) Les constantes seront stockées dans le pool de constantes de la classe appelante lors de la phase de compilation. Par essence, elles ne font pas référence directement à la classe qui définit la constante, donc à l'initialisation de la classe qui définit la constante. ne sera pas déclenché.

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