Welche Rolle spielt ein ClassLoader in Java?



Dieser Artikel ist eine umfassende Anleitung zur Funktionsweise des ClassLoader in Java. Es werden die Typen, Prinzipien und Methoden von ClassLoader in Java erläutert.

Während der Arbeit in Java verwenden wir häufig eine große Anzahl von Klassen. Diese Java-Klassen werden nicht alle gleichzeitig in den Speicher geladen, sondern bei Bedarf von einer Anwendung geladen. Hier kommen Java ClassLoaders ins Spiel. In diesem Artikel werde ich anhand von Beispielen die Verwendung des ClassLoader in Java erläutern.

Die folgenden Themen werden in diesem Artikel behandelt:





  1. Was ist ClassLoader?
  2. Arten von ClassLoader
  3. Prinzipien von ClassLoader
  4. Methoden von ClassLoader
  5. Benutzerdefinierter ClassLoader

Lass uns anfangen!

Was ist ClassLoader in Java?

ClassLoader in Java wird von der Java Runtime Environment aufgerufen, um die Klassen dynamisch zu laden, wann immer dies von der Anwendung in der erforderlich ist Java virtuelle Maschine . Da ClassLoaders Teil der Java-Laufzeitumgebung sind, hat die Java Virtual Machine keine Ahnung von den zugrunde liegenden Dateien und Dateisystemen.



Lassen Sie uns nun die verschiedenen Arten von integrierten ClassLoadern in Java verstehen.

Arten von ClassLoader in Java

Die verschiedenen Arten von ClassLoadern in Java sind wie folgt:

Lassen Sie uns jeden einzelnen einzeln besprechen.



Erweiterung ClassLoader

Wie der Name schon sagt, lädt der Extension ClassLoader die Erweiterungen der Java-Kernklassen aus dem JDK Erweiterungsbibliothek. Es ist ein untergeordnetes Element des Bootstrap ClassLoader und lädt die Erweiterungen aus dem Verzeichnis JRE / lib / text oder einem anderen Verzeichnis, das in der Systemeigenschaft java.ext.dirs angegeben ist.

Anwendungs- oder System ClassLoader

Die Anwendung oder der System ClassLoader ist ein untergeordnetes Element des Extension ClassLoader. Dieser ClassLoader-Typ lädt alle Klassen auf Anwendungsebene, die in der Befehlszeilenoption -cp oder in der Umgebungsvariablen CLASSPATH enthalten sind.

Bootstrap ClassLoader

Wie wir alle wissen Java-Klassen werden von einer Instanz von geladen java.lang.ClassLoade. Da ClassLoaders jedoch Klassen sind, ist der Bootstrap ClassLoader dafür verantwortlich, die internen JDK-Klassen zu laden. BootStrap ClassLoader ist ein Maschinencode, der den Vorgang startet, wenn JVM ihn aufruft und die Klassen aus rt.jar lädt. Sie können also verstehen, dass der Bootstrap ClassLoader keinen übergeordneten ClassLoader hat und daher als Primordial ClassLoader bezeichnet wird.

Hinweis: Die Priorität von Bootstrap ist höher als die von Extension, und die Priorität, die dem Extension ClassLoader zugewiesen wird, ist höher als die von Application ClassLoader. Siehe Bild unten:

Arten von ClassLoader - ClassLoader in Java - Edureka

Lassen Sie uns als nächstes in diesem Artikel die Prinzipien verstehen, nach denen der ClassLoader arbeitet.

Prinzipien von ClassLoader in Java

Die Regeln, auf denen der Java ClassLoader basiert, sind die folgenden drei Prinzipien:

Lassen Sie uns jeden von ihnen verstehen.

Einzigartigkeitseigenschaft

Diese Eigenschaft stellt sicher, dass keine Klassen wiederholt werden und alle Klassen eindeutig sind. Die Eindeutigkeitseigenschaft stellt außerdem sicher, dass Klassen, die vom übergeordneten ClassLoader geladen werden, nicht vom untergeordneten ClassLoader geladen werden. In einem Szenario, in dem der übergeordnete ClassLoader die Klasse nicht finden kann, versucht die aktuelle Instanz, dies selbst zu tun.

Festlegen des Klassenpfads für Java

Delegierungsmodell

ClassLoader in Java basiert auf den vom Delegierungsmodell angegebenen Operationen. Wenn also eine Anforderung zum Suchen einer Klasse oder Ressource generiert wird, delegiert eine ClassLoader-Instanz die Suche nach der Klasse oder der Ressource an den übergeordneten ClassLoader.

Die Operationen, auf denen der ClassLoader basiert, lauten wie folgt:

  • Die Java Virtual Machine prüft, ob die Klasse geladen ist oder nicht, wenn sie auf eine Klasse stößt.
  • In dem Fall, in dem die Klasse geladen ist JVM Fahren Sie mit der Ausführung der Klasse fort, aber in einem Szenario, in dem die Klasse nicht geladen istJVM fordert das Java ClassLoader-Subsystem auf, diese bestimmte Klasse zu laden. Danach gibt das ClassLoader-Subsystem dem Application ClassLoader die Kontrolle.
  • Der Application ClassLoader delegiert die Anforderung dann an den Extension ClassLoader, der die Anforderung anschließend an den Bootstrap ClassLoader weiterleitet.
  • Jetzt sucht der Bootstrap ClassLoader in derBootstrap-Klassenpfad, um zu überprüfen, ob die Klasse verfügbar ist oder nicht. Wenn die Klasse verfügbar ist, wird sie geladen, andernfalls wird die Anforderung erneut an den Extension ClassLoader übergeben.
  • Der Extension ClassLoader sucht im Erweiterungsklassenpfad nach der Klasse.Wenn die Klasse verfügbar ist, wird sie geladen, andernfalls wird die Anforderung erneut an den Application ClassLoader übergeben.
  • Schließlich sucht der Application ClassLoader im Anwendungsklassenpfad nach der Klasse.Wenn die Klasse verfügbar ist, wird sie geladen, andernfalls wird eine Ausnahme von ClassNotFoundException angezeigt.

Siehe das Bild unten.

Sichtbarkeitsprinzip

Nach diesem Prinzip sind die Klassen der Kinder für die Klassen sichtbar, die von den übergeordneten ClassLoadern geladen wurden, aber umgekehrt ist dies nicht der Fall. Die vom Application ClassLoader geladenen Klassen haben also Einblick in die vom Extension- und Bootstrap ClassLoader geladenen Klassen.

Wenn wir beispielsweise zwei Klassen haben: A & B, nehmen wir an, dass Klasse A vom Application ClassLoader und Klasse B vom Extensions ClassLoader geladen wird. Hier sind die Klassen A und B für alle vom Application ClassLoader geladenen Klassen sichtbar, Klasse B jedoch nur für die vom Extension ClassLoader geladenen Klassen.

Wenn Sie versuchen, diese Klassen mit dem Bootstrap ClassLoader zu laden, wird das angezeigt java.lang.ClassNotFoundException . Ausnahme.

Okay, jetzt, da Sie die Arten von ClassLoadern und die Prinzipien dahinter kennen, lassen Sie uns einige wichtige Methoden untersuchenvon dem java.lang.ClassLoader Klasse.

Methoden von ClassLoader in Java

Nur wenige wesentliche von ClassLoader sind wie folgt:

loadClass (Stringname, boolesche Auflösung)

Diese Methode ist der Einstiegspunkt des ClassLoader und wird zum Laden der Klasse verwendet, auf die von der JVM verwiesen wird. Es nimmt den Namen des als Parameter. Die JVM ruft die loadClass () -Methode auf, um die Klassenreferenzen aufzulösen, indem der boolesche Wert auf true gesetzt wird. Nur wenn wir feststellen müssen, ob die Klasse existiert oder nicht, wird der boolesche Parameter auf false gesetzt.

Erklärung:

public Class loadClass (Stringname, boolesche Auflösung) löst ClassNotFoundException {aus

defineClass ()

Eine letzte Methode zum Definieren eines Bytearrays als Instanz einer Klasse. Wenn die Klasse dann ungültig ist, wird ein ClassFormatError ausgelöst.

Erklärung:

protected final Class defineClass (Stringname, Byte [] b, int off, int len) löst ClassFormatError aus

findClass (String name)

Die findClass-Methode wird verwendet, um die angegebene Klasse zu finden. Es findet also nur die Klasse mit einem vollständig qualifizierten Namen als Parameter, lädt die Klasse jedoch nicht. Die loadClass () -Methode ruft diese Methode auf, wenn der übergeordnete ClassLoader die angeforderte Klasse nicht finden kann. Wenn kein übergeordnetes Element des ClassLoader die Klasse findet, löst die Standardimplementierung a aus ClassNotFoundException.

Erklärung:

protected Class findClass (String name) löst ClassNotFoundException aus

Class.forName (String name, boolean initialize, ClassLoader loader)

Diese Methode wird zum Laden und Initialisieren der Klasse verwendet. Es besteht die Möglichkeit, einen der ClassLoader auszuwählen. Wenn der ClassLoader-Parameter NULL ist, wird automatisch der Bootstrap ClassLoader verwendet.

Erklärung:

Die öffentliche statische Klasse forName (Stringname, boolesche Initialisierung, ClassLoader-Loader) löst eine ClassNotFoundException aus

getParent ()

Die getParent-Methode wird verwendet, um den übergeordneten ClassLoader zur Delegierung zurückzugeben.

Erklärung:

public final ClassLoader getParent ()

getResource ()

Wie der Name schon sagt, hat die Methode getResource () versucht, eine Ressource mit dem angegebenen Namen zu finden. Die Anforderung für die Ressource wird zunächst an den übergeordneten ClassLoader delegiert. Wenn das übergeordnete Element null ist, wird der in die JVM integrierte Pfad des ClassLoader durchsucht. Wenn dies fehlschlägt, ruft die Methode die findResource (String) auf, um die Ressource zu finden, wobei der Ressourcenname als Eingabe angegeben wird, die entweder der absolute oder der relative Klassenpfad sein kann. Anschließend wird ein URL-Objekt zum Lesen der Ressource zurückgegeben oder ein Nullwert zurückgegeben, wenn die Ressource nicht über ausreichende Berechtigungen zum Zurückgeben der Ressource verfügt oder nicht gefunden wurde.

Erklärung:

öffentliche URL getResource (String name)

Lassen Sie uns in diesem Artikel über ClassLoader in Java den benutzerdefinierten ClassLoader verstehen.

Benutzerdefinierter ClassLoader in Java

Die integrierten ClassLoaders kümmern sich um die meisten Fälle, in denen sich die Dateien bereits im Dateisystem befinden. Wenn Sie die Klassen jedoch von der lokalen Festplatte laden möchten, müssen Sie benutzerdefinierte ClassLoaders verwenden.

Erstellen Sie einen benutzerdefinierten ClassLoader

Um einen benutzerdefinierten ClassLoader zu erstellen, müssen Sie den erweitern ClassLoader Klasse und überschreiben die findClass () Methode:

Beispiel: Erstellen Sie einen benutzerdefinierten ClassLoader, der den Standard-ClassLoader erweitert und ein Byte-Array aus der angegebenen Datei lädt. Siehe den folgenden Code.

Paket edureka importieren java.io.ByteArrayOutputStream importieren java.io.File importieren java.io.IOException importieren java.io.InputStream öffentliche Klasse Beispiel erweitert ClassLoader {@Override public Class findClass (String samplename) löst ClassNotFoundException {byte [] b = customLoadClassFromFromFromFromFromFromFrome (samplename) return defineClass (samplename, b, 0, b.length)} privates 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}}

Damit beenden wir diesen Artikel über ClassLoader in Java. Ich hoffe, Sie haben verstanden, was ClassLoaders in Java sind, welche Methoden es gibt, welche Arten von ClassLoadern es gibt usw.

Wenn Sie diesen Artikel zu 'ClassLoader in Java' gefunden haben, lesen Sie die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Wir sind hier, um Ihnen bei jedem Schritt auf Ihrer Reise zu helfen. Neben diesen Fragen zu Java-Interviews haben wir einen Lehrplan entwickelt, der für Studenten und Fachleute gedacht ist, die eine sein möchten Java Entwickler.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses „ClassLoader in Java '' und wir werden uns so schnell wie möglich bei Ihnen melden.