Hiérarchie de ClassLoader et chargeurs personnalisés
Comprenez les chargeurs de classes d’amorçage, de plateforme et d’application, puis écrivez un ClassLoader personnalisé.
Hiérarchie de ClassLoader et chargeurs personnalisés est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.
La hiérarchie des ClassLoader
La JVM utilise une hiérarchie de ClassLoaders. Chaque chargeur possède un parent ; avant de charger lui-même une classe, il délègue au parent (modèle de délégation parent d'abord).
ClassLoader d'amorçage
Le ClassLoader d'amorçage charge les classes principales du JDK (java.lang.*, java.util.*). Il est implémenté en code natif et n'a pas de parent Java ; getParent() renvoie null.
ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)ClassLoader de la plateforme (Java 9 ou version ultérieure)
Le ClassLoader de la plateforme (anciennement ClassLoader d'extension) charge les modules du JDK qui ne font pas partie de l'ensemble d'amorçage (java.sql, java.xml, etc.). Son parent est le chargeur d'amorçage.
ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoaderClassLoader d'application (système)
Le ClassLoader d'application charge les classes de l'application depuis le chemin de classes (-cp / CLASSPATH). Son parent est le ClassLoader de la plateforme. C'est le chargeur par défaut du code utilisateur.
ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoaderDélégation parent d'abord
Lors du chargement de com.example.MyService, l'AppClassLoader interroge d'abord son parent (la plateforme), qui interroge l'amorçage. Ce n'est que si aucun des parents ne peut la charger que l'enfant tente de la charger lui-même.
Identité des classes et ClassLoaders
Deux classes portant le même nom et chargées par des ClassLoaders différents sont considérées comme des types différents. Une conversion de type entre elles lève ClassCastException — un point important dans les systèmes de modules d'extension et OSGi.
// Loaded by two different loaders → different Class objects
Class<?> c1 = loader1.loadClass("com.example.Plugin");
Class<?> c2 = loader2.loadClass("com.example.Plugin");
System.out.println(c1 == c2); // false!Écrire un ClassLoader personnalisé
Étendez ClassLoader et redéfinissez findClass(String name). Lisez le bytecode depuis une source personnalisée (JAR chiffré, réseau, base de données), puis appelez defineClass.
public class EncryptedClassLoader extends ClassLoader {
public EncryptedClassLoader(ClassLoader parent) { super(parent); }
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] bytes = decrypt(readBytecodeFromVault(name));
return defineClass(name, bytes, 0, bytes.length);
}
}ClassLoader URL : chargement depuis des JAR
URLClassLoader charge des classes depuis une liste d'URL (chemins de fichiers ou URL HTTP). Il est utile pour les systèmes de modules d'extension qui ajoutent des JAR à l'exécution.
URL[] urls = { new File("plugins/my-plugin.jar").toURI().toURL() };
try (URLClassLoader loader = new URLClassLoader(urls, getClass().getClassLoader())) {
Class<?> cls = loader.loadClass("com.example.PluginImpl");
Plugin plugin = (Plugin) cls.getDeclaredConstructor().newInstance();
plugin.start();
}Fermer les ClassLoaders
Fermez toujours URLClassLoader lorsque vous avez terminé : il garde les JAR ouverts. Sa fermeture permet de supprimer ou de mettre à jour les JAR. Utilisez la gestion automatique des ressources.
Délégation enfant d'abord (chargement isolé)
Certains conteneurs (Tomcat, JAR autonome Spring Boot) inversent la hiérarchie : le chargeur enfant essaie en premier, puis se rabat sur le parent uniquement si la classe est introuvable. Cela isole les versions des bibliothèques entre les applications web.
Fuites de ClassLoader
Un chargeur de classes n'est récupéré par le ramasse-miettes que lorsqu'aucune classe qu'il a chargée n'est encore accessible. Les champs statiques qui contiennent des objets provenant d'une classe chargée maintiennent le chargeur en vie — une fuite fréquente lors des redéploiements.
Vérification rapide
Que fait un ClassLoader avant d'essayer de charger lui-même une classe ?
Récapitulatif
Hiérarchie à trois niveaux : amorçage → plateforme → application. La délégation parent d'abord empêche la duplication des classes. Les chargeurs personnalisés redéfinissent findClass. Utilisez URLClassLoader pour les systèmes de modules d'extension. Fermez les chargeurs pour éviter les fuites.
Questions Fréquemment Posées
La leçon « Hiérarchie de ClassLoader et chargeurs personnalisés » est-elle gratuite ?
Oui — le texte complet de « Hiérarchie de ClassLoader et chargeurs personnalisés » 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 « Hiérarchie de ClassLoader et chargeurs personnalisés » ?
Comprenez les chargeurs de classes d’amorçage, de plateforme et d’application, puis écrivez un ClassLoader personnalisé. 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 2 sur 4.
Combien de temps prend la leçon « Hiérarchie de ClassLoader et chargeurs personnalisés » ?
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