Lorsque nous voulons utiliser une classe, nous devons la charger en mémoire via ClassLoader
"La phase de chargement de la classe complète principalement les trois choses suivantes"
Obtenez le flux binaire de la classe via le nom complet de la classe
Analysez le flux binaire de la classe dans la structure de données dans la zone des méthodes
Créez une instance de la classe java.lang.Class à représenter le type, comme zone de méthode cette entrée d'accès à la classe
"Il existe de nombreuses façons d'obtenir le flux binaire d'une classe via le nom complet de la classe"
Obtenez-le à partir du package zip "Récupérez-le depuis le réseau" dans le chargeur de classe de la machine virtuelle Java pour terminer, ou vous pouvez utiliser le chargeur de classe personnalisé pour terminer"
Lien
"Cette étape de liaison est principalement divisée en 3 parties, vérification, préparation et analyse"
Vérification
" L'étape de vérification est principalement pour garantir que Classe Le format du fichier est correct et ne mettra pas en danger la sécurité de la machine virtuelle lors de son exécution."
Il existe de nombreuses règles dans la phase de vérification, mais elles sont grossièrement divisées en quatre étapes "Je n'expliquerai pas les détails spécifiques en détail, vous pouvez voir" "Compréhension approfondie de la machine virtuelle Java", cet article préfère faire un résumé et saisir le processus global de chargement des classes sans élaborer sur les détails. pour les variables statiques de la classe et initialisez-les aux valeurs par défaut"
Les valeurs par défaut des types de données courants sont les suivantes
Type de données
Valeur par défaut
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
boolean
false
char
'u0000'
référence
null
"Si l'attribut ConstantValue existe dans la table attributaire de champ de la variable statique de classe, l'instruction d'affectation sera exécutée directement"
Alors dans quelles circonstances l'attribut ConstantValue existe-t-il dans la table attributaire de champ de la variable statique de classe ?
Les variables statiques de classe sont des types de données de base et sont modifiées par final
Les variables statiques de classe sont de type String, sont modifiées par final et se voient attribuer des valeurs sous forme de littéraux
Dans l'ordre pour faciliter la visualisation des octets du code du fichier Class, j'ai téléchargé un plug-in jclasslib Bytecode viewer dans IDEA, ce qui est très pratique. Utilisez le code suivant pour le vérifier sous forme de bytecode
public class Person {
private static int age = 10;
private static final int length = 160;
private static final String name = "name";
private static final String loc = new String("loc");
}
Copier après la connexion
"Ainsi, les attributs de longueur et de nom se verront attribuer les valeurs spécifiées par ConstantValue lors de la phase de préparation"
"Puis à quelle étape le les attributs age et loc doivent-ils être attribués ? classes, interfaces, champs et méthodes en références directes 》Référence symbolique : utilisez un ensemble de symboles pour décrire la cible référencée
Référence directe ; pointeur direct vers la cible
Rejoignez-moi et écrivez une classe comme suit
public class Student {
private String name;
private int age;
public String getName() {
return this.name;
}
}
Copier après la connexion
En prenant les champs comme exemple, les objets correspondant au nom et à l'âge ne pointent pas directement vers l'adresse mémoire, mais sont décrits avec des chaînes ( c'est-à-dire référence symbolique). L'étape d'analyse consiste à convertir ces descriptions en pointeurs pointant directement vers la cible (c'est-à-dire des références directes)
初始化
「执行类静态成员变量赋值语句和静态代码块中的语句」
我们把上面的Student代码改成如下形式
public class Student {
private String name;
private int age = 10;
private static int gender = 1;
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public Student() {
System.out.println("构造函数");
}
public String getName() {
return this.name;
}
}
Exécutez l'instruction d'affectation de la variable statique
Exécutez l'instruction dans le bloc de code statique
Une chose à noter est que "La machine virtuelle Java garantit cela avant la méthode de la sous-classe est exécuté, la méthode de la classe parent a été exécutée"
"Il est encore nécessaire de comprendre le rôle des méthodes et à propos des blocs de code statiques, des blocs de code construits et de l'ordre d'exécution des fonctions construits "
Je vais résumer la conclusion directement ici. Vous pouvez écrire une démo pour la vérifier
"Ordre d'exécution sans héritage"
Blocs de code statiques et variables membres statiques, l'ordre d'exécution est donné par L'ordre d'écriture est déterminé (il ne sera exécuté qu'une seule fois)
Construisez des blocs de code et des variables membres non statiques, l'ordre d'exécution est déterminé par l'écriture order
Constructor
"Ordre d'exécution avec héritage"
Statique (bloc de code statique, variables membres statiques) de la classe parent, statique (bloc de code statique, variables membres statiques) de la sous-classe (ne sera exécuté qu'une seule fois)
Non-statique (bloc de code construit) de la classe parent, variables membres non statiques), le constructeur de la classe parent
le non-statique (bloc de code de construction, variables membres non statiques) de la sous-classe, le constructeur de la sous-classe
Unloading
Le garbage collection se produit non seulement dans le tas, mais également dans la zone des méthodes. Cependant, les conditions de recyclage des données de type dans la zone méthode sont assez strictesLa figure suivante est un exemple Je souhaite recycler la classe Simple dans la zone méthode
.
Vous devez vous assurer que la classe Sample et ses sous-classes dans le tas ont été recyclées
Le MyClassLoader qui charge la classe Sample a été recyclé
L'objet Class correspondant à la classe Sample a été recyclé
Vous pouvez voir Les conditions de recyclage des données de type dans la zone de méthode sont relativement dures, mais les résultats sont minimes, donc certains éboueurs ne recycleront pas les données de type dans la zone de méthode
Résumé
Processus de chargement des classes
Processus d'affectation des variables
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!
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