Phases de chargement des classes : chargement, liaison, initialisation
Parcourez le chargement, la vérification, la préparation, la résolution et l’initialisation des classes.
Phases de chargement des classes : chargement, liaison, initialisation est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Le cycle de chargement d'une classe
Une classe Java traverse trois phases avant de pouvoir être utilisée : le chargement (rechercher et lire le bytecode), la liaison (vérifier, préparer et résoudre) et l'initialisation (exécuter les initialisateurs statiques).
Phase 1 : chargement
Le ClassLoader lit le fichier .class (depuis le système de fichiers, un JAR, le réseau ou du bytecode généré) et crée dans le tas un objet Class<?> qui le représente.
// Trigger loading explicitly:
Class<?> c = Class.forName("com.example.MyService");
// The JVM delegates to the appropriate ClassLoader to find and load MyService.classPhase 2a : vérification
Le vérificateur de bytecode contrôle que le bytecode chargé est structurellement valide, sûr du point de vue des types et conforme aux règles de la spécification de la JVM. Un bytecode invalide (par exemple, manipulé incorrectement avec ASM) provoque une VerifyError.
Phase 2b : préparation
La JVM alloue de la mémoire pour les champs statiques et leur attribue leurs valeurs par défaut (0, false, null). Les initialisateurs statiques n'ont PAS encore été exécutés à ce stade.
public class Config {
static int timeout = 30; // after preparation: timeout = 0 (default)
static String host = "db"; // after preparation: host = null
// Both get their real values only after Initialization
}Phase 2c : résolution
Les références symboliques (noms de classes, signatures de méthodes) du pool de constantes sont remplacées par des références directes (pointeurs) vers les classes et les méthodes réelles. Cette résolution peut être différée (résolution paresseuse).
Phase 3 : initialisation
Les initialisateurs statiques (blocs static {}) et les affectations de champs statiques s'exécutent dans l'ordre du texte. C'est à ce moment que timeout = 30 et host = "db" sont réellement exécutés.
public class Config {
static int timeout;
static String host;
static {
timeout = Integer.parseInt(System.getenv("TIMEOUT"));
host = System.getenv("DB_HOST");
System.out.println("Config initialized");
}
}Déclencheurs de l'initialisation des classes
L'initialisation s'effectue lors de la première occurrence de l'un des événements suivants : (1) création d'une instance, (2) accès à un champ statique (non constant), (3) appel d'une méthode statique, (4) utilisation de la réflexion via Class.forName() (avec initialize=true), (5) initialisation d'une sous-classe.
// forName with initialize=false skips static initializers:
Class<?> c = Class.forName("com.example.MyService", false, loader);La méthode <clinit>
La JVM génère une méthode <clinit> (initialiseur de classe) à partir de tous les initialisateurs statiques et de toutes les affectations de champs statiques. Elle s'exécute exactement une fois et est sûre vis-à-vis des threads : la JVM garantit l'exclusion mutuelle.
ExceptionInInitializerError
Si un initialisateur statique lève une exception, la JVM l'enveloppe dans ExceptionInInitializerError. Les tentatives ultérieures d'utilisation de la classe lèvent NoClassDefFoundError.
static {
if (System.getenv("DB_URL") == null)
throw new RuntimeException("DB_URL not set"); // wrapped in ExceptionInInitializerError
}Ordre de l'initialisation statique
Les initialisateurs statiques s'exécutent dans l'ordre du texte. Les dépendances circulaires entre classes pendant l'initialisation peuvent produire des classes partiellement initialisées — un piège connu du modèle d'initialisation à la demande par classe porteuse.
class A {
static final int X = B.Y + 1; // accesses B before B is initialized!
}
class B {
static final int Y = A.X + 1; // circular!
}Observer le chargement des classes
Activez la sortie de journalisation du chargement des classes avec -Xlog:class+load=info (JVM 9 ou version ultérieure) pour voir quelles classes sont chargées, depuis où et par quel ClassLoader.
// JVM flag:
// java -Xlog:class+load=info:file=classload.log MyApp
// Output lines like:
// [info][class,load] com.example.MyService source: file:///app/app.jarVérification rapide
Pendant quelle phase les initialisateurs statiques s'exécutent-ils ?
Récapitulatif
Chargement : lire le bytecode. Liaison : vérifier → préparer (valeurs par défaut nulles) → résoudre (références symboliques). Initialisation : exécuter <clinit>. L'initialisation est déclenchée lors de la première utilisation et est sûre vis-à-vis des threads. Les dépendances circulaires pendant l'initialisation provoquent des erreurs subtiles.
Questions Fréquemment Posées
La leçon « Phases de chargement des classes : chargement, liaison, initialisation » est-elle gratuite ?
Oui — le texte complet de « Phases de chargement des classes : chargement, liaison, initialisation » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Phases de chargement des classes : chargement, liaison, initialisation » ?
Parcourez le chargement, la vérification, la préparation, la résolution et l’initialisation des classes. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Phases de chargement des classes : chargement, liaison, initialisation » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Phases de chargement des classes : chargement, liaison, initialisation
- Hiérarchie de ClassLoader et chargeurs personnalisés
- Inspecter le bytecode avec javap
- Compilation JIT et compilation par niveaux