Qu’est-ce qu’un Java ClassLoader?

En quelques phrases simples, qu’est-ce qu’un Java ClassLoader, quand est-il utilisé et pourquoi?

OK, j’ai lu un article sur le wiki. ClassLoader charge les classes. D’ACCORD. Donc, si j’inclus les fichiers jar et que je les importe, un ClassLoader fait le travail.

Pourquoi devrais-je déranger avec ce ClassLoader? Je ne l’ai jamais utilisé et je ne le savais pas.

La question est la suivante: pourquoi la classe ClassLoader existe-t-elle? Et aussi, comment l’utilisez vous en pratique? (Les cas existent, je sais.)

Tiré de ce beau tutoriel de Sun:

Motivation

Les applications écrites dans des langages de programmation compilés statiquement, tels que C et C ++, sont compilées en instructions natives spécifiques à la machine et enregistrées en tant que fichier exécutable. Le processus de combinaison du code dans un code natif exécutable est appelé liaison – la fusion du code compilé séparément avec le code de la bibliothèque partagée pour créer une application exécutable. Ceci est différent dans les langages de programmation compilés dynamicment tels que Java. En Java, les fichiers .class générés par le compilateur Java restnt en l’état jusqu’à ce qu’ils soient chargés dans la machine virtuelle Java (JVM). En d’autres termes, le processus de liaison est exécuté par la machine virtuelle Java au moment de l’exécution. Les classes sont chargées dans la JVM selon les besoins. Et lorsqu’une classe chargée dépend d’une autre classe, cette classe est également chargée.

Lorsqu’une application Java est lancée, la première classe à exécuter (ou le point d’entrée dans l’application) est celle avec la méthode vide statique publique appelée main (). Cette classe a généralement des références à d’autres classes et toutes les tentatives de chargement des classes référencées sont effectuées par le chargeur de classes.

Pour avoir une idée de ce chargement de classe récursif ainsi que de l’idée de chargement de classe en général, considérez la classe simple suivante:

public class HelloApp { public static void main(Ssortingng argv[]) { System.out.println("Aloha! Hello and Bye"); } } 

Si vous exécutez cette classe en spécifiant l’option de ligne de commande -verbose: class afin qu’elle affiche les classes en cours de chargement, vous obtenez une sortie qui se présente comme suit. Notez qu’il ne s’agit que d’une sortie partielle car la liste est trop longue pour être affichée ici.

 prmpt>java -verbose:class HelloApp [Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar] [Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar] [Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar] [Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar] [Loaded java.lang.Object from shared objects file] [Loaded java.io.Serializable from shared objects file] [Loaded java.lang.Comparable from shared objects file] [Loaded java.lang.CharSequence from shared objects file] [Loaded java.lang.Ssortingng from shared objects file] [Loaded java.lang.reflect.GenericDeclaration from shared objects file] [Loaded java.lang.reflect.Type from shared objects file] [Loaded java.lang.reflect.AnnotatedElement from shared objects file] [Loaded java.lang.Class from shared objects file] [Loaded java.lang.Cloneable from shared objects file] [Loaded java.lang.ClassLoader from shared objects file] [Loaded java.lang.System from shared objects file] [Loaded java.lang.Throwable from shared objects file] . . . [Loaded java.security.BasicPermissionCollection from shared objects file] [Loaded java.security.Principal from shared objects file] [Loaded java.security.cert.Certificate from shared objects file] [Loaded HelloApp from file:/C:/classes/] Aloha! Hello and Bye [Loaded java.lang.Shutdown from shared objects file] [Loaded java.lang.Shutdown$Lock from shared objects file] 

Comme vous pouvez le constater, les classes d’exécution Java requirejses par la classe d’application (HelloApp) sont chargées en premier.

Chargeurs de classes dans la plate-forme Java 2

Le langage de programmation Java continue d’évoluer pour faciliter la vie des développeurs d’applications au quotidien. Cela se fait en fournissant des API qui simplifient votre vie en vous permettant de vous concentrer sur la logique métier plutôt que sur les détails d’implémentation des mécanismes fondamentaux. Ceci est évident par le récent changement de J2SE 1.5 à J2SE 5.0 afin de refléter la maturité de la plate-forme Java.

A compter de JDK 1.2, un chargeur de classe d’amorçage intégré à la machine virtuelle Java est chargé de charger les classes du moteur d’exécution Java. Ce chargeur de classe ne charge que les classes trouvées dans le chemin de classes de démarrage, et comme il s’agit de classes approuvées, le processus de validation n’est pas exécuté comme pour les classes non approuvées. Outre le chargeur de classe d’amorçage, la machine virtuelle Java possède un chargeur de classe d’extension chargé de charger les classes à partir des API d’extension standard et un chargeur de classe système qui charge les classes à partir d’un chemin de classe général et de vos classes d’application.

Comme il y a plus d’un chargeur de classe, ils sont représentés dans un arbre dont la racine est le chargeur de classe bootstrap. Chaque chargeur de classe a une référence à son chargeur de classe parent. Lorsqu’un chargeur de classe est invité à charger une classe, il consulte son chargeur de classe parent avant d’essayer de charger l’élément lui-même. Le parent à son tour consulte son parent, etc. Donc, ce n’est qu’après que tous les chargeurs de classes ancêtres ne peuvent pas trouver la classe dans laquelle le chargeur de classe actuel est impliqué. En d’autres termes, un modèle de délégation est utilisé.

La classe java.lang.ClassLoader

java.lang.ClassLoader est une classe abstraite pouvant être sous-classée par les applications devant étendre la manière dont la machine virtuelle charge dynamicment les classes. Les constructeurs de java.lang.ClassLoader (et de ses sous-classes) vous permettent de spécifier un parent lorsque vous instanciez un nouveau chargeur de classe. Si vous ne spécifiez pas explicitement de parent, le chargeur de classe système de la machine virtuelle sera affecté comme parent par défaut. En d’autres termes, la classe ClassLoader utilise un modèle de délégation pour rechercher des classes et des ressources. Par conséquent, chaque instance de ClassLoader possède un chargeur de classe parent associé, de sorte que lorsque la demande de recherche d’une classe ou de ressources est demandée, la tâche est déléguée à son chargeur de classe parent avant de rechercher la classe ou la ressource elle-même. La méthode loadClass() du ClassLoader effectue les tâches suivantes, dans l’ordre, lorsqu’elle est appelée pour charger une classe:

Si une classe a déjà été chargée, elle la renvoie. Sinon, il délègue la recherche de la nouvelle classe au chargeur de classe parent. Si le chargeur de classe parent ne trouve pas la classe, loadClass() appelle la méthode findClass() pour rechercher et charger la classe. La méthode finalClass() recherche la classe dans le chargeur de classe en cours si la classe n’a pas été trouvée par le chargeur de classe parent.


Il y a plus dans l’article original, qui vous montre également comment implémenter vos propres chargeurs de classe réseau, ce qui répond à votre question sur pourquoi (et comment). Voir aussi les documents API .

La plupart des développeurs Java n’auront jamais besoin d’utiliser explicitement des chargeurs de classes (sauf pour charger des ressources afin qu’elles fonctionnent encore lorsqu’elles sont regroupées dans des JAR), et encore moins pour écrire leurs propres ressources.

Les ClassLoaders sont utilisés dans les grands systèmes et les applications serveur pour faire des choses comme:

  • Modulariser un système et charger, décharger et mettre à jour des modules à l’exécution
  • Utiliser des versions différentes d’une bibliothèque API (par exemple un parsingur XML) en parallèle
  • Isoler les différentes applications exécutées dans la même JVM (en veillant à ce qu’elles n’interfèrent pas les unes avec les autres, par exemple au moyen de variables statiques)

La question est “Pourquoi faut-il déranger cette classe ClassLoader”?

Eh bien, la plupart du temps, vous pouvez réparer les choses si elles se passent mal :-).

C’est vrai, tant que vous écrivez une application, la comstackz dans un fichier JAR et incluez peut-être quelques fichiers JAR de bibliothèque supplémentaires, vous n’avez pas besoin de connaître les chargeurs de classes, cela fonctionnera.

Cependant, il est utile de connaître un peu les chargeurs de classes et le chargement des classes pour mieux comprendre ce qui se passe en coulisse. Par exemple, les “initialisateurs statiques” seront exécutés lorsqu’une classe est chargée, donc pour comprendre quand ils s’exécuteront, vous devez savoir comment le chargeur de classes décide quand les charger.

aussi .. comment l’utilisez vous dans la pratique?

Pour les cas simples, vous n’en avez pas besoin. Toutefois, si vous avez besoin de charger le code dynamicment à l’exécution avec un contrôle explicite de son origine (par exemple, chargement sur un réseau, chargement de plug-ins non disponibles au moment de la compilation, etc.), vous devrez peut-être en faire plus. Ensuite, vous pouvez par exemple écrire votre propre chargeur de classe. Voir les autres réponses pour les liens.

ClassLoader en Java est une classe utilisée pour charger des fichiers de classe en Java. Le code Java est compilé en fichier de classe par le compilateur javac et JVM exécute le programme Java, en exécutant des codes d’octets écrits dans le fichier de classe.

ClassLoader est chargé de charger les fichiers de classe à partir du système de fichiers, du réseau ou de toute autre source. Il existe trois chargeurs de classes par défaut utilisés dans les chargeurs de classes Java, Bootstrap , Extension et System ou Application .

ClassLoader


Comment fonctionne ClassLoader

## Interaction ClassLoader avec JVM entrer la description de l'image ici

Plus @: comment-classloader-works-in-java.html

Les chargeurs de classes sont un composant fonctionnel de JVM, qui charge les données de classe à partir du fichier ‘.class’ ou du réseau vers la zone de méthode dans Heap.

Ressemble à une partie intégrante de la JVM, mais en tant qu’utilisateur Java final, pourquoi devrais-je m’inquiéter? Voici pourquoi:

Chaque chargeur de classe a son propre espace de nom et les classes appelées par un chargeur de classe particulier entrent dans son espace de nom.

Les classes appelées par deux chargeurs de classes différents n’auront pas de visibilité les unes sur les autres, ce qui améliore la sécurité.

Le mécanisme de délégation enfant parent du chargeur de classes garantit que les classes api Java ne pourront jamais être piratées par du code non autorisé.

Pour plus de détails, regardez ici

Les chargeurs de classes sont hiérarchiques. Les classes sont introduites dans la JVM car elles sont référencées par nom dans une classe qui est déjà en cours d’exécution dans la machine virtuelle Java.

Comment la toute première classe chargée?
La toute première classe est chargée à l’aide de static main() méthode static main() déclarée dans votre classe. Toutes les classes chargées par la suite sont chargées par les classes déjà chargées et en cours d’exécution.

Un chargeur de classe crée un espace de noms. Toutes les JVM incluent au moins un chargeur de classe intégré à la JVM, appelé chargeur de classe primordial (ou bootstrap) . C’est une chose et nous allons examiner les chargeurs de classe non primordiaux. La JVM a des crochets pour permettre aux chargeurs de classe définis par l’utilisateur d’être utilisés à la place du chargeur de classe primordial. Voici les chargeurs de classes créés par la JVM.

Bootstrap (primordial) Ce chargeur de classe n’est pas rechargeable. Charge les classes internes JDK, les packages java. * (Charge généralement les fichiers rt.jar et i18n.jar). Extesions Ce chargeur de classe n’est pas rechargeable. Charge les fichiers JAR à partir du répertoire des extensions JDK (généralement lib / ext de JRE). Système Ce chargeur de classe n’est pas rechargeable. Charge les classes à partir du chemin de classe du système.

http://www.sbalasani.com/2015/01/java-class-loaders_fr.html