Quel est le rôle d'un ClassLoader en Java?



Cet article est un guide complet sur le fonctionnement du ClassLoader en Java. Il traite des types, principes et méthodes de ClassLoader en Java.

Tout en travaillant en Java, nous utilisons souvent un grand nombre de classes. Ces classes Java ne sont pas chargées en même temps dans la mémoire, au lieu de cela, elles sont chargées lorsque cela est requis par une application. C'est là qu'interviennent les ClassLoaders Java. Donc, dans cet article, je vais expliquer comment utiliser le ClassLoader en Java avec des exemples.

Les sujets suivants seront traités dans cet article:





  1. Qu'est-ce que ClassLoader?
  2. Types de ClassLoader
  3. Principes de ClassLoader
  4. Méthodes de ClassLoader
  5. ClassLoader personnalisé

Commençons!

Qu'est-ce que ClassLoader en Java?

ClassLoader en Java est appelé par l'environnement d'exécution Java pour charger dynamiquement les classes chaque fois que l'application le requiert dans le Machine virtuelle Java . Puisque les ClassLoaders font partie de l'environnement d'exécution Java, la machine virtuelle Java n'aura aucune idée des fichiers et systèmes de fichiers sous-jacents.



Voyons maintenant les différents types de ClassLoaders intégrés en Java.

Types de ClassLoader en Java

Les différents types de ClassLoaders en Java sont les suivants:

Discutons chacun d'eux un par un.



Extension ClassLoader

Comme son nom l'indique, l'extension ClassLoader charge les extensions des classes Java principales à partir du JDK Bibliothèque d'extension. Il s'agit d'un enfant du Bootstrap ClassLoader et charge les extensions à partir du répertoire JRE / lib / text ou de tout autre répertoire spécifié dans la propriété système java.ext.dirs.

Application ou système ClassLoader

L'application ou le ClassLoader système est un enfant du ClassLoader d'extension. Ce type de ClassLoader charge toutes les classes de niveau application trouvées dans l'option de ligne de commande -cp ou dans la variable d'environnement CLASSPATH.

Bootstrap ClassLoader

Comme nous le savons tous Classes Java sont chargés par une instance de java.lang.ClassLoade. Mais, puisque les ClassLoaders sont des classes, le ClassLoader Bootstrap est chargé de charger les classes internes JDK. BootStrap ClassLoader est un code machine qui démarre l'opération lorsque JVM l'appelle et charge les classes à partir de rt.jar. Ainsi, vous pouvez comprendre que le Bootstrap ClassLoader sert n'a pas de ClassLoader parent et est donc connu sous le nom de Primordial ClassLoader.

Remarque: La priorité de Bootstrap est supérieure à Extension et la priorité donnée à Extension ClassLoader est supérieure à Application ClassLoader. Reportez-vous à l'image ci-dessous:

Types de ClassLoader - ClassLoader en Java - Edureka

Ensuite dans cet article, laissez-nous comprendre les principes sur lesquels le ClassLoader fonctionne.

Principes de ClassLoader en Java

L'ensemble de règles sur la base desquelles fonctionne Java ClassLoader sont les trois principes suivants:

Comprenons chacun d'eux.

Propriété d'unicité

Cette propriété garantit qu'il n'y a pas de répétition de classes et que toutes les classes sont uniques. La propriété d'unicité garantit également que les classes chargées par le ClassLoader parent ne sont pas chargées par le ClassLoader enfant. Dans un scénario où le ClassLoader parent ne peut pas trouver la classe, l'instance actuelle tentera de le faire par elle-même.

Modèle de délégation

ClassLoader en Java fonctionne en fonction de l'ensemble des opérations données par le modèle de délégation. Ainsi, chaque fois qu'une requête est générée pour trouver une classe ou une ressource, une instance ClassLoader déléguera la recherche de la classe ou de la ressource au ClassLoader parent.

L'ensemble des opérations sur lesquelles fonctionne le ClassLoader est le suivant:

  • La machine virtuelle Java vérifie si la classe est chargée ou non, chaque fois qu'elle rencontre une classe.
  • Dans le cas où la classe est chargée JVM procède à l'exécution de la classe, mais dans un scénario où la classe n'est pas chargée, alorsJVM demande au sous-système Java ClassLoader de charger cette classe particulière. Après cela, le sous-système ClassLoader donne le contrôle à Application ClassLoader.
  • L'application ClassLoader délègue ensuite la demande à l'extension ClassLoader, qui la transmet ensuite au Bootstrap ClassLoader.
  • Maintenant, le Bootstrap ClassLoader recherche dans leBootstrap classpath pour vérifier si la classe est disponible ou non. Si la classe est disponible, elle est chargée, sinon la demande est à nouveau transmise à l'extension ClassLoader.
  • L'extension ClassLoader vérifie la classe dans le chemin d'accès aux classes d'extension.Si la classe est disponible, elle est chargée, sinon la demande est à nouveau transmise à Application ClassLoader.
  • Enfin, Application ClassLoader recherche la classe dans le chemin de classe de l'application.Si la classe est disponible, puis est chargée, sinon vous verrez une exception de ClassNotFoundException.

Reportez-vous à l'image ci-dessous.

Principe de visibilité

Selon ce principe, les classes enfants sont visibles pour les classes chargées par ses ClassLoaders parents, mais l’inverse n’est pas vrai. Ainsi, les classes chargées par l'Application ClassLoader ont une visibilité sur les classes chargées par l'Extension et Bootstrap ClassLoader.

type de transformation en informatica

Par exemple, si nous avons deux classes: A et B, supposons que la classe A est chargée par l'Application ClassLoader et que la classe B est chargée par l'Extensions ClassLoader. Ici, les classes A et B sont visibles par toutes les classes chargées par l'Application ClassLoader, mais la classe B n'est visible que par les classes chargées par l'Extension ClassLoader.

De plus, si vous essayez de charger ces classes à l'aide du Bootstrap ClassLoader, vous verrez le java.lang.ClassNotFoundException . exception.

Très bien, maintenant que vous connaissez les types de ClassLoaders et les principes qui les sous-tendent, examinons quelques méthodes importantesdu java.lang.ClassLoader classe.

Méthodes de ClassLoader en Java

Peu d'essentiels de ClassLoader sont les suivants:

loadClass (nom de chaîne, résolution booléenne)

Cette méthode est le point d'entrée du ClassLoader et permet de charger la classe référencée par la JVM. Il prend le nom du comme paramètre. La machine virtuelle Java appelle la méthode loadClass () pour résoudre les références de classe en définissant la valeur booléenne sur true. Seulement si nous devons déterminer si la classe existe ou non, le paramètre booléen est défini sur false.

Déclaration:

La classe publique loadClass (nom de chaîne, résolution booléenne) jette une exception ClassNotFoundException {

defineClass ()

Une dernière méthode utilisée pour définir un tableau d'octets en tant qu'instance d'une classe. Dans le cas où la classe n'est pas valide, elle lève une ClassFormatError.

Déclaration:

Protection finale de la classe defineClass (String name, byte [] b, int off, int len) renvoie ClassFormatError

findClass (nom de chaîne)

La méthode findClass est utilisée pour rechercher la classe spécifiée. Donc, il trouve simplement la classe avec un nom complet comme paramètre mais ne charge pas la classe. La méthode loadClass () appelle cette méthode si le ClassLoader parent ne peut pas trouver la classe demandée. De plus, si aucun parent du ClassLoader ne trouve la classe, l'implémentation par défaut lève un ClassNotFoundException.

Déclaration:

La classe protégée findClass (String name) lève une exception ClassNotFoundException

Class.forName (nom de chaîne, initialisation booléenne, chargeur de ClassLoader)

Cette méthode est utilisée pour charger et initialiser la classe. Il donne une option pour choisir l'un des ClassLoaders et si le paramètre ClassLoader est NULL, alors automatiquement le ClassLoader Bootstrap est utilisé.

Déclaration:

Public static Class forName (String name, boolean initialize, ClassLoader loader) lève une exception ClassNotFoundException

getParent ()

La méthode getParent est utilisée pour renvoyer le ClassLoader parent pour la délégation.

Déclaration:

public final ClassLoader getParent ()

getResource ()

Comme son nom l'indique, la méthode getResource () a tenté de trouver une ressource avec le nom donné. Il déléguera initialement la demande au ClassLoader parent pour la ressource. Si le parent est nul, le chemin du ClassLoader intégré à la JVM est recherché. Désormais, si cela échoue, la méthode invoquera findResource (String) pour trouver la ressource, où le nom de la ressource est spécifié en tant qu'entrée pouvant être le chemin de classe absolu ou relatif. Ensuite, il renvoie un objet URL pour lire la ressource ou retourne une valeur nulle si la ressource ne dispose pas des privilèges adéquats pour renvoyer la ressource ou est introuvable.

Déclaration:

URL publique getResource (nom de chaîne)

Ensuite, dans cet article sur ClassLoader en Java, laissez-nous comprendre le ClassLoader personnalisé.

ClassLoader personnalisé en Java

Les ClassLoaders intégrés prendront en charge la plupart des cas où les fichiers sont déjà dans le système de fichiers, mais si vous souhaitez charger les classes hors du disque dur local, vous devez utiliser des ClassLoaders personnalisés.

Créer un ClassLoader personnalisé

Pour créer un ClassLoader personnalisé, vous devez étendre le ClassLoader classe et remplacer le findClass () méthode:

Exemple: Créons un ClassLoader personnalisé qui étend le ClassLoader par défaut et charge un tableau d'octets à partir du fichier spécifié. Reportez-vous au code ci-dessous.

package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class Exemple étend ClassLoader {@Override public Class findClass (String samplename) lance ClassNotFoundException {byte [] b = customFoundClassFass (samplename) return defineClass (samplename, b, 0, b.length)} private byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Avec cela, nous arrivons à la fin de cet article sur ClassLoader en Java. J'espère que vous avez compris ce que sont les ClassLoaders en Java, ses méthodes, les différents types de ClassLoaders, etc.

Si vous avez trouvé cet article sur «ClassLoader en Java», consultez le par Edureka, une entreprise d'apprentissage en ligne de confiance avec un réseau de plus de 250 000 apprenants satisfaits répartis dans le monde entier. Nous sommes là pour vous aider à chaque étape de votre voyage, pour devenir une autre question d'entrevue java, nous proposons un programme conçu pour les étudiants et les professionnels qui souhaitent devenir un Java Développeur.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires de ce «ClassLoader en Java ' et nous vous répondrons dans les plus brefs délais.