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 :
jre/lib/ext.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); } }
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.
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.