Maison  >  Article  >  Java  >  ClassLoader en Java

ClassLoader en Java

王林
王林original
2024-08-30 16:04:05955parcourir

Un ClassLoader est un objet responsable du chargement dynamique de la classe Java pendant l'exécution pour empêcher JVM de se rendre compte que ClassLoader fait partie de l'environnement d'exécution Java. Cela facilite la vie de la JVM. JVM charge les classes en mémoire lorsque l'application le requiert et ne les charge pas toutes en même temps. ClassLoader entre alors en scène et charge la classe en mémoire.

Commencez votre cours de développement de logiciels libres

Développement Web, langages de programmation, tests de logiciels et autres

Comment implémenter ClassLoader en Java ?

Voyons comment java.lang.ClassLoader est implémenté dans le code de la bibliothèque Java et quelles sont ses fonctionnalités.

java.lang.ClassLoader :

public abstract class ClassLoader {
public class loadClass(String name);
protected class defineClass(byte[] b);
public URL getResource(String name);
public Enumeration getResources(String name);
public ClassLoader getParent()
};

Regardons quelles sont les fonctionnalités du ClassLoader en java :

  • loadClass() : C'est la méthode importante qui prendra le nom d'une classe sous forme de chaîne et renverra une instance d'une classe, et ce sera la classe qui chargera la classe. a trouvé sur son chemin de classe, et il le fournira afin qu'un objet puisse en être instancié.
  • defineClass() : Cette méthode fonctionne de manière similaire à celle de la méthode loadClass, sauf qu'elle prend un tableau d'octets comme argument, puis créera une classe à partir de ce tableau d'octets, ce qui signifie qu'elle prend la classe elle-même. sous forme de tableau d'octets. Elle est légèrement différente de la méthode LoadClass car la classe elle-même est donnée sous forme de tableau d'octets, alors que LoadClass doit trouver cette classe pour la charger.
  • getResource() ou getResources() : Cette méthode est une clé pour diagnostiquer tout problème lié au chargement de la classe car elle fournit une URL ou une énumération d'URL lorsque vous fournissez un nom de chaîne et un nom du paquet. Il vous donnera le chemin exact d'où et comment votre classe se charge, en laissant de côté toutes vos hypothèses.
  • getparent() : C'est une méthode clé pour comprendre la hiérarchie de classLoader. ClassLoader n'est pas une structure plate, et vous avez une hiérarchie parents-enfants ainsi que des niveaux et des niveaux de structure.

Comment fonctionne ClassLoader en Java ?

Exemple pour démontrer le fonctionnement d'un chargeur de classe :

Code :

public class A() {
public void addOne() {
B b = new B();
b.addTwo();
}
}

Comment le ClassLoader chargera les classes dans le scénario ci-dessus :

  • Comme nous pouvons le voir, dans le code ci-dessus, la classe A appelle une fonction addOne(). Et à l'intérieur de cette fonction, une instance est créée de la classe B et une autre méthode de la classe B comme addTwo() est appelée.
  • Ainsi, le classLoader chargera la classe A, puis le chargeur de classe chargera la classe B. L'appel sera donc provoqué comme class.getClassLoader().loadClass("B");
  • Grâce à cette fonctionnalité des chargeurs de classes, nous pouvons avoir une hiérarchie de classes et décoder leur connexion.

Types de ClassLoader

Dans ce didacticiel, nous allons parler des différents types de chargeurs de classes et de leurs fonctionnalités intégrées, ainsi que des raisons pour lesquelles ils sont utilisés.

1. Chargeur de classe Bootstrap

  • Java ClassLoader est également une instance de java.lang. ClassLoader, qui est une classe, imaginez qui chargera les classes ClassLoader. Nous verrons le scénario dans lequel Bootstrap ClassLoader entre en scène.
  • Il chargera tous les rt.jar et autres bibliothèques principales du répertoire $JAVA_HOME/jre/lib.
  • Il sert de parent à toutes les autres instances de ClassLoader.
  • C'est l'une des parties de la JVM et est écrit en code natif ; ainsi, l'implémentation peut être modifiée pour ce ClassLoader particulier.

2. Chargeur de classe d'extension

L'extension ClassLoader est un enfant de Bootstrap. Il est utilisé pour charger les extensions de toutes les classes Java entrant dans JVM.

3. Chargeur de classe d'application

  • C'est un enfant de Extension ClassLoader.
  • Il est utilisé pour charger toutes les classes au niveau de l'application dans la variable d'environnement classpath –classpath ou –cp.

Fuites du ClassLoader

Chaque classe a un lien vers toutes les classes qu'elle crée. Il doit effectivement disposer d’une mémoire pour stocker les champs statiques. Si classLoader perd un champ statique pour une classe unique, cela signifie simplement que vous perdez un ClassLoader. Si vous le faites, vous perdrez toutes les classes et un tas d'objets et tous les objets auxquels ils sont liés. Les fuites de ClassLoader peuvent être bien trop dangereuses.

Chaque fois que nous effectuons un redéploiement ou ajoutons des améliorations au moment de l'exécution dans notre application, ClassLoader chargera une classe, ne rechargera ni ne déchargera jamais une classe. Ainsi, lorsqu'un classLoaders charge une seule classe à partir de zéro, il aura des objets afin de la recréer ou de la recharger à partir de zéro. L'ancien chargeur de classe envoie l'objet de l'ancien état au nouvel état. Donc lors de cette transition, il pourrait y avoir une fuite. Ainsi, lorsque vous divulguez un objet, vous divulguez une classe, et c'est donc le chargeur de classe.

Principles of Java ClassLoader

There are 3 principles that a java ClassLoader works upon:

  • Delegation Model: It delegates class loading requests to parent ClassLoader and loads class only if the parent is not able to find or load the class.
  • Visibility Principle: This principle states the visibility scope of loaded classes. Class loaded by its parent is visible to parent class loaders, but the class loaded by its child is not visible to the parent class loader.
  • Uniqueness Property: It ensures that there is no repetition of classes in the class loader. If a parent loads a class, then its corresponding child does not load this class.

Example of Custom ClassLoader

This is the custom ClassLoader example named with ClassLoaderJava.java:

Code: ClassLoaderJava.java

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ClassLoaderJava extends ClassLoader{
// created to load class and invoke method.
public void classLoadingDemo(String classBinString, String methodName) {
try {
// will create an instance of class loader. ClassLoader classLoaderInstance =
this.getClass().getClassLoader();
// creating an instance of a class to store the loaded class. Class loadedClass =
classLoaderInstance.loadClass(classBinString);
System.out.println("Loaded class name is: " + loadedClass.getName());
// Fetching the constructor of loaded class. Constructor con = loadedClass.getConstructor();
// creating an instance to invoke the method. Object obj = con.newInstance();
// Will store the method fetched from loaded class.
Method invokingMethod = loadedClass.getMethod(methodName); System.out.println("Invoked method name is: " +
invokingMethod.getName());
invokingMethod.invoke(obj);
} catch (ClassNotFoundException e) { e.printStackTrace();
} catch (Exception e) { e.printStackTrace();
}
}
}

Code: DemoClass.java

public class DemoClass {
public void add() {
System.out.println("This method is invoked by the classLoader.");
}
}

Code: LoadingTest.java

public  class  LoadingTest  {
public  static  void  main(String[]  args)  {
ClassLoaderJava classLoader = new ClassLoaderJava();
classLoader.classLoadingDemo("DemoClass" , "add");
}
}

Output:

ClassLoader en Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn