Qu'est-ce qu'un ClassLoader Java?


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

OK, j'ai lu un article wiki. ClassLoader charge les classes. OK. Donc, si j'inclus des fichiers jar et que j'importe, un ClassLoader fait le travail.

Pourquoi devrais-je m'embêter avec ce ClassLoader? Je n'ai jamais utilisé et je ne savais pas qu'il existait.

La question est, pourquoi la classe ClassLoader existe-t-elle? Et aussi, comment l'utilisez-vous en pratique? (Cas existent, je le sais.)

Author: Premraj, 2010-03-11

6 answers

Tiré de ce joli tutoriel de Sun:

Motivation

Les applications écrites dans des langages de programmation compilés statiquement, tels que C et C++, sont compilées dans des instructions natives spécifiques à la machine et enregistrées en tant que fichier exécutable. Le processus de combinaison du code en un code natif exécutable est appelé liaison - la fusion de code compilé séparément avec du code de bibliothèque partagée pour créer une application exécutable. Ceci est différent en compilé dynamiquement les langages de programmation comme Java. En Java, l' .les fichiers de classe générés par le compilateur Java restent tels quels jusqu'à ce qu'ils soient chargés dans la Machine virtuelle Java (JVM) - en d'autres termes, le processus de liaison est effectué par la JVM lors de l'exécution. Les classes sont chargées dans la JVM "au besoin". 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 classe.

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(String 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 imprime les classes en cours de chargement, vous obtiendrez 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.String 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 voir, les classes d'exécution Java requises par la classe d'application (HelloApp) sont chargées en premier.

Chargeurs de classe dans la plate-forme Java 2

Le langage de programmation Java ne cesse d'évoluer pour faciliter la vie quotidienne des développeurs d'applications. Ceci est fait en fournissant des API qui vous simplifient la vie en vous permettant de vous concentrer sur la logique métier plutôt que les détails de mise en œuvre des mécanismes fondamentaux. Ceci est évident par le récent changement de J2SE 1.5 en J2SE 5.0 afin de refléter la maturité de la plate-forme Java.

Depuis JDK 1.2, un chargeur de classes bootstrap intégré à la JVM est responsable du chargement des classes du runtime Java. Ce chargeur de classes ne charge que les classes qui se trouvent dans le chemin de classe de démarrage, et comme il s'agit de classes de confiance, le processus de validation n'est pas effectué comme pour les classes non approuvées. Dans outre le chargeur de classes bootstrap, la JVM dispose d'un chargeur de classes d'extension responsable du chargement des classes à partir d'API d'extension standard et d'un chargeur de classes système qui charge les classes à partir d'un chemin de classe général ainsi que 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 consulte à son tour son parent, et ainsi de suite. Ce n'est donc qu'après que tous les chargeurs de classe ancêtre ne trouvent pas la classe que le chargeur de classe actuel est impliqué. En d'autres termes, un modèle de délégation est utilisé.

Le java.lang.ClassLoader Classe

Le java.lang.ClassLoader est une classe abstraite qui peut être sous-classée par les applications qui ont besoin d'étendre la manière dont la JVM charge dynamiquement les classes. Les constructeurs dans java.lang.ClassLoader (et 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 un parent, le chargeur de classe système de la machine virtuelle sera attribué en tant que 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 a un chargeur de classe parent associé, de sorte que lorsqu'on lui demande de trouver une classe ou des ressources, la tâche est déléguée à sa classe parente chargeur avant d'essayer de trouver 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 le chargeur de classe parent. Si le chargeur de classe parent ne trouve pas la classe, loadClass() appelle la méthode findClass() pour trouver et charger la classe. La méthode finalClass() recherche la classe dans le chargeur de classe actuel 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 de savoir pourquoi (et comment). Voir aussi lesAPI docs .

 199
Author: JRL, 2013-11-24 01:19:51

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

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 différentes versions d'une bibliothèque d'API (par exemple un analyseur XML) en parallèle
  • Isoler différentes applications en cours d'exécution dans la même JVM (en s'assurant qu'elles n'interfèrent pas les unes avec les autres, par exemple via des variables statiques)
 41
Author: Michael Borgwardt, 2011-11-28 22:33:33

La question est "Pourquoi devrait-on s'embêter cette classe ClassLoader existe"?

Eh bien, surtout pour que vous puissiez réparer les choses si elles vont mal :-).

C'est vrai, tant que vous écrivez simplement une application, que vous la compilez dans un pot et que vous incluez peut-être quelques pots de bibliothèque supplémentaires, vous n'avez pas besoin de connaître les chargeurs de classe, cela fonctionnera simplement.

Néanmoins, il est utile d'en savoir un peu plus sur les chargeurs de classe et le chargement de classe pour mieux comprendre ce qui se passe dans les coulisses. Comme un par exemple, les "initialiseurs statiques" s'exécuteront lorsqu'une classe est chargée, donc pour comprendre quand ils s'exécuteront, vous devez savoir comment le chargeur de classe décide quand les charger.

Aussi.. comment l'utilisez-vous en pratique ?

Pour les cas simples, vous n'en avez pas besoin. Cependant, si vous avez besoin de charger du code dynamiquement à l'exécution avec un contrôle explicite d'où il vient (par exemple, chargement sur un réseau, chargement de plugins non disponibles au moment de la compilation, etc.), vous devrez peut-être faire plus. Ensuite, vous peut par exemple écrire votre propre chargeur de classe. Voir les autres réponses pour les liens.

 26
Author: sleske, 2010-03-11 12:18:08

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

ClassLoader est responsable du chargement des 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 en Java, Bootstrap , Extension et Système ou Application chargeur de classe.

Chargeur de classe


Comment fonctionne ClassLoader

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

@ Plus : comment-chargeur de classe-travaille-en-java.html

 9
Author: roottraveller, 2017-10-31 07:17:30

Les chargeurs de classe sont un composant fonctionnel de la JVM, qui charge les données de classe à partir du '.class ' fichier ou à partir du réseau dans la zone de méthode dans le tas.

Ressemble à une partie intégrante de la JVM, mais en tant qu'utilisateur final de java, pourquoi devrais-je être concerné? Voici pourquoi:

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

Les classes invoquées par deux chargeurs de classes différents n'auront pas de visibilité sur chacune d'autres, résultant dans l'amélioration de la sécurité.

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

Pour plus de détails regardez ici

 4
Author: bitan, 2014-02-21 05:53:01

Les chargeurs de classe sont hiérarchiques. Les classes sont introduites dans la JVM car elles sont référencées par leur nom dans une classe qui s'exécute déjà dans la JVM.

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

Un chargeur de classe crée un espace de noms. Tous les JVM incluent au moins un chargeur de classe cela est intégré dans la JVM appelée le chargeur de classe primordial (ou bootstrap) . C'est une chose, et nous examinerons les chargeurs de classe non primordiale. 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 classe créés par la JVM.

Bootstrap (primordiale) Ce chargeur de classe pas re chargeable. Charge les classes internes JDK, java.* paquets (généralement des charges rt.jar et i18n.jar). Extesions Ce classe chargeur pas re chargeable. Charge les fichiers jar à partir du répertoire JDK extensions (généralement lib/ext de JRE). Système Ce chargeur de classe pas re chargeable. Charge les classes à partir du chemin de classe système.

Http://www.sbalasani.com/2015/01/java-class-loaders.html

 1
Author: Srinivas Balasani, 2016-07-26 17:46:43