Heim  >  Artikel  >  Java  >  ClassLoader in Java

ClassLoader in Java

王林
王林Original
2024-08-30 16:04:05992Durchsuche

Ein ClassLoader ist ein Objekt, das für das dynamische Laden von Java-Klassen während der Laufzeit verantwortlich ist, um zu verhindern, dass JVM erkennt, dass ClassLoader Teil der Java-Laufzeitumgebung ist. Es macht das JVM-Leben einfacher. JVM lädt die Klassen in den Speicher, wenn die Anwendung sie benötigt, und lädt nicht alle auf einmal. Dann kommt ClassLoader ins Spiel und lädt die Klasse in den Speicher.

Starten Sie Ihren kostenlosen Softwareentwicklungskurs

Webentwicklung, Programmiersprachen, Softwaretests und andere

Wie implementiert man ClassLoader in Java?

Sehen wir uns an, wie der java.lang.ClassLoader im Java-Bibliothekscode implementiert ist und welche Funktionen er bietet.

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()
};

Schauen wir uns an, welche Funktionen der ClassLoader in Java bietet:

  • loadClass(): Dies ist die wichtige Methode, die den Namen einer Klasse als Zeichenfolge akzeptiert und eine Instanz einer Klasse zurückgibt, und dies wird die Klasse sein, die den Klassenlader enthält hat es in seinem Klassenpfad gefunden und stellt es bereit, damit daraus ein Objekt instanziiert werden kann.
  • defineClass(): Diese Methode funktioniert ähnlich wie die Methode „loadClass“, außer dass sie ein Byte-Array als Argument verwendet und dann eine Klasse aus diesem Byte-Array erstellt, was bedeutet, dass sie die Klasse selbst übernimmt als Byte-Array. Sie unterscheidet sich geringfügig von der Methode „loadClass“, da die Klasse selbst als Byte-Array angegeben wird, während „loadClass“ diese Klasse finden muss, um sie zu laden.
  • getResource() oder getResources(): Diese Methode ist ein Schlüssel zur Diagnose von Problemen im Zusammenhang mit dem Laden der Klasse, da sie eine URL oder eine Aufzählung von URLs zurückgibt, wenn Sie einen Zeichenfolgennamen und einen angeben Paketname. Es zeigt Ihnen den genauen Pfad an, von wo und wie Ihre Klasse geladen wird, und lässt dabei alle Ihre Annahmen außer Acht.
  • getparent(): Es ist eine Schlüsselmethode, um die Hierarchie von classLoader zu verstehen. ClassLoader ist keine flache Struktur, und Sie haben eine Eltern-Kind-Hierarchie und Strukturebenen und -ebenen.

Wie funktioniert ClassLoader in Java?

Beispiel zur Veranschaulichung der Funktionsweise eines Klassenladers:

Code:

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

Wie der ClassLoader Klassen im obigen Szenario lädt:

  • Wie wir im obigen Code sehen können, ruft Klasse A eine Funktion addOne() auf. Und innerhalb dieser Funktion wird eine Instanz der Klasse B erstellt und eine weitere Methode der Klasse B als addTwo() aufgerufen.
  • Der ClassLoader lädt also Klasse A und dann lädt der Klassenlader Klasse B. Der Aufruf wird also wie folgt ausgeführt: class.getClassLoader().loadClass(„B“);
  • Aufgrund dieser Funktion von Klassenladern können wir eine Hierarchie von Klassen erstellen und ihre Verbindung entschlüsseln.

Typen von ClassLoader

In diesem Tutorial werden wir über verschiedene Arten von Klassenladern und ihre integrierten Funktionen sprechen und warum sie verwendet werden.

1. Bootstrap ClassLoader

  • Java ClassLoader ist auch eine Instanz von java.lang. ClassLoader ist eine Klasse. Stellen Sie sich vor, wer ClassLoader-Klassen laden wird. Wir werden das Szenario sehen, in dem Bootstrap ClassLoader ins Spiel kommt.
  • Es werden alle rt.jar und andere Kernbibliotheken aus dem Verzeichnis $JAVA_HOME/jre/lib geladen.
  • Sie dient als übergeordnete Instanz aller anderen ClassLoader-Instanzen.
  • Es ist einer der JVM-Teile und ist in nativem Code geschrieben; Daher kann die Implementierung für diesen bestimmten ClassLoader geändert werden.

2. Erweiterung ClassLoader

Die Erweiterung ClassLoader ist ein Kind von Bootstrap. Es wird verwendet, um die Erweiterungen aller Java-Klassen zu laden, die in JVM eintreffen.

3. Anwendungsklassenlader

  • Es ist ein untergeordnetes Element der Erweiterung ClassLoader.
  • Es wird verwendet, um alle Klassen auf Anwendungsebene in die Klassenpfad-Umgebungsvariable –classpath oder –cp zu laden.

ClassLoader-Lecks

Jede Klasse hat einen Link zu allen Klassen, die sie erstellt. Es muss effektiv über einen Speicher zum Speichern statischer Felder verfügen. Wenn classLoader ein statisches Feld für eine einzelne Klasse verliert, bedeutet das lediglich, dass Sie einen ClassLoader verlieren. Wenn Sie dies tun, verlieren Sie alle Klassen und eine Reihe von Objekten sowie alle Objekte, mit denen sie verknüpft sind. ClassLoader-Lecks können viel zu gefährlich sein.

Jedes Mal, wenn wir eine erneute Bereitstellung durchführen oder zur Laufzeit in unserer Anwendung Verbesserungen hinzufügen, lädt ClassLoader eine Klasse, lädt jedoch niemals eine Klasse neu oder entlädt sie. Wenn also ein Klassenlader eine einzelne Klasse von Grund auf lädt, verfügt er über einige Objekte, um sie neu zu erstellen oder von Grund auf neu zu laden. Der alte Klassenlader sendet das Objekt vom alten Zustand in den neuen Zustand. Bei diesem Übergang kann es also zu einem Leck kommen. Wenn Sie also ein Objekt verlieren, verlieren Sie auch eine Klasse, also den Klassenlader.

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 in Java

Das obige ist der detaillierte Inhalt vonClassLoader in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn