ProgrammationDéveloppeur Java

Qu'est-ce que la classe ClassLoader en Java, quels types existent et quelles sont ses principales tâches ? Comment les chargeurs de classes influencent-ils l'isolation des classes et les problèmes de compatibilité ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

ClassLoader est un composant spécial dans la JVM, responsable du chargement du bytecode des classes en mémoire lors de leur première utilisation. Il permet de charger des classes dynamiquement à partir de diverses sources (système de fichiers, réseau, archive, etc.).

Types de chargeurs de classes :

  • Bootstrap ClassLoader — le chargeur système, charge les classes de base de la JVM (rt.jar).
  • Extension ClassLoader — charge les extensions à partir du chemin jre/lib/ext.
  • System (Application) ClassLoader — charge les classes de l'application à partir du classpath.
  • Custom ClassLoader — chargeurs personnalisés, utiles pour la modularité, le déploiement à chaud, les plugins.

ClassLoader implémente la délégation : il essaie d'abord de charger une classe via le chargeur parent (parent-first), et seulement s'il échoue, il recherche par lui-même.

Isolation des classes : Chaque chargeur de classes crée son propre "espace de visibilité" pour les classes. Deux classes portant le même nom, chargées par des chargeurs différents, sont considérées comme des types différents au sein de la JVM.

Exemple de création d'un chargeur personnalisé :

class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { // Votre code pour rechercher et charger le bytecode de la classe return super.findClass(name); } }

Question piège

Deux classes portant le même nom, chargées par des chargeurs différents, peuvent-elles être considérées comme une seule classe au sein de la JVM ?

Réponse : Non ! La JVM considère une classe comme unique par la paire (nom complet de la classe, chargeur de classes). Par conséquent, les mêmes classes, chargées par des chargeurs différents, seront considérées comme différentes.


Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


Histoire

Dans une application d'entreprise avec support pour une architecture de plug-in, les plugins étaient chargés par des chargeurs de classes distincts. En conséquence, une tentative de transmission d'un objet de type interface (PluginInterface) entre l'application principale et le plugin provoquait une ClassCastException, car la même interface était chargée par des chargeurs différents.


Histoire

Lors de l'utilisation d'un chargeur de classes personnalisé, la délégation au chargeur parent n'était pas activée. Cela a conduit à un rechargement des classes de bibliothèques standard, provoquant des erreurs étranges de ClassCastException et LinkageError.


Histoire

Dans un grand serveur Java EE, différentes applications chargeaient leurs versions de la même bibliothèque. La négligence dans la configuration de la chaîne de chargeurs a conduit à un chevauchement des classes entre les applications, ce qui a entraîné une fuite de mémoire massive et des pannes dues à des conflits de versions.