Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung des Klassenladers basierend auf der Java-Klassenlademethode

Detaillierte Erläuterung des Klassenladers basierend auf der Java-Klassenlademethode

黄舟
黄舟Original
2017-10-20 09:29:221454Durchsuche

Der folgende Editor bietet Ihnen eine detaillierte Erläuterung der klassenbasierten Lademethode classloader_java. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor, um einen Blick darauf zu werfen

Grundkonzepte

Classloader-Klassenlader, der zum Laden von Java-Klassen in die Java Virtual Machine verwendet wird . Es unterscheidet sich von gewöhnlichen Programmen. Java-Programme (Klassendateien) sind keine lokal ausführbaren Programme. Wenn Sie ein Java-Programm ausführen, führen Sie zuerst die JVM (Java Virtual Machine) aus und laden Sie dann die Java-Klasse zur Ausführung in die JVM. Der für das Laden der Java-Klasse verantwortliche Teil heißt Class Loader.

Die JVM selbst enthält einen ClassLoader namens Bootstrap ClassLoader. Wie die JVM ist der Bootstrap ClassLoader im lokalen Code implementiert und für das Laden der Kern-JavaClass (d. h. aller Klassen, die mit java.* beginnen) verantwortlich. Darüber hinaus stellt die JVM auch zwei ClassLoader bereit, die beide in der Java-Sprache geschrieben sind und vom Bootstrap ClassLoader geladen werden. Der Extension ClassLoader ist für das Laden erweiterter Java-Klassen verantwortlich (z. B. alle Klassen, die mit javax.* beginnen) und Klassen im ext-Verzeichnis der JRE gespeichert). ApplicationClassLoader ist für das Laden der eigenen Klassen der Anwendung verantwortlich.

Beim Ausführen eines Programms startet die JVM den Bootstrap-Klassenlader und führt ihn aus. Der ClassLoader lädt die Java-Kern-API (ExtClassLoader und AppClassLoader werden zu diesem Zeitpunkt ebenfalls geladen) und ruft dann ExtClassLoader auf, um die Erweiterungs-API zu laden AppClassLoader lädt das CLASSPATH-Verzeichnis. Die definierte Klasse ist der grundlegendste Ladevorgang eines Programms.

Hinweis: Lernen Sie ClassLoader kennen und sehen Sie sich OSGI-Programmanwendungen an.

Wann verwendet die JVM ClassLoader, um eine Klasse zu laden? Wenn Sie Java zum Ausführen einer Klasse verwenden, verwendet die JVM ApplicationClassLoader, um die Klasse zu laden. Wenn dann Klasse A auf Klasse B verweist, unabhängig davon, ob es sich um eine direkte Referenz oder eine Referenz mit Class.forName () handelt, findet die JVM den ClassLoader, der Klasse A lädt, und verwendet diesen ClassLoader, um Klasse B zu laden. Die JVM bestimmt, ob sie neue Klassen gemäß den effektiven Ausführungsanweisungen zur Laufzeit laden muss, um so wenige Klassen wie möglich zu laden. Dies unterscheidet sich von kompilierten Klassen.

Warum Ihren eigenen ClassLoader verwenden?

Es scheint, dass der JVM-eigene ClassLoader ausreicht. Warum müssen wir unseren eigenen ClassLoader erstellen?

Da der mit der JVM gelieferte ClassLoader nur Standard-Java-Klassendateien aus dem lokalen Dateisystem laden kann, können Sie, wenn Sie Ihren eigenen ClassLoader schreiben, Folgendes tun:

1) Vor der Ausführung nicht vertrauenswürdig Code, digitale Signaturen automatisch überprüfen

2) Erstellen Sie dynamisch benutzerdefinierte Konstruktionsklassen, die den spezifischen Anforderungen der Benutzer entsprechen

3) Erhalten Sie Java-Klassen von bestimmten Orten, z. B. Datenbanken

4) Warten

Tatsächlich wird bei der Verwendung von Applet ein bestimmter ClassLoader verwendet, da zu diesem Zeitpunkt die Java-Klasse aus dem Netzwerk geladen und relevante Sicherheitsinformationen überprüft werden müssen.

Die meisten Anwendungsserver nutzen die ClassLoader-Technologie. Auch wenn Sie keinen eigenen ClassLoader erstellen müssen, hilft Ihnen das Verständnis seiner Prinzipien dabei, Ihre eigenen Anwendungen besser bereitzustellen.

Wichtiger Hinweis: Tatsächlich kann eine geladene Klasse nicht aktualisiert werden, wenn Sie versuchen, denselben ClassLoader erneut zu laden wird eine Ausnahme erhalten (java.lang.LinkageError: doppelte Klassendefinition), und wir können nur eine neue ClassLoader-Instanz neu erstellen, um die neue Klasse erneut zu laden. Was die ursprünglich geladene Klasse betrifft, muss sich der Entwickler nicht darum kümmern, da möglicherweise noch Instanzen verwendet werden. Solange die relevanten Instanzen vom Speicher recycelt werden, entlädt die JVM die Klassen, die nicht mehr verwendet werden der passende Zeitpunkt.

Die meisten Java-Programme verwenden drei Arten von Klassenladern, die vom System bereitgestellt werden

1. Starten Sie den Klassenlader (Bootstrap ClassLoader). ), verantwortlich für das Laden der Klassenbibliothek, die im Verzeichnis lib oder im durch den Parameter -Xbootclasspath angegebenen Pfad vorhanden ist und von der virtuellen Maschine erkannt wird. Beachten Sie, dass sie durch den Dateinamen identifiziert wird. Wie beispielsweise rt .jar werden Klassenbibliotheken mit inkonsistenten Namen nicht geladen, selbst wenn sie im lib-Verzeichnis abgelegt werden.

2. Erweiterungsklassenlader (ExtClassLoader), der für alle Klassenbibliotheken im libext-Verzeichnis oder im durch die Systemvariable java.ext.dirs angegebenen Pfad verantwortlich ist.

3. Der über cassLoader.getSystemClassLoader() abgerufene Anwendungsklassenlader (App-ClassLoader) ist für das Laden der im Benutzerklassenpfad (ClassPath) angegebenen Klassenbibliothek verantwortlich Programmgerät.

Das übergeordnete Delegationsmodell ist eine von Java-Designern für Entwickler empfohlene Methode zum Laden von Klassen. Der Arbeitsprozess des übergeordneten Delegationsmodells ist: Wenn ein Klassenlader eine Klassenladeanforderung erhält, versucht er nicht zuerst, die Klasse selbst zu laden , delegiert diese Anforderung jedoch zur Vervollständigung an den übergeordneten Klassenlader. Dies gilt für jede Ebene des Klassenladers, sodass alle Ladeanforderungen nur dann an den übergeordneten Klassenlader übertragen werden, wenn dies nicht der Fall ist Wenn die erforderliche Klasse gefunden wird, versucht der Subloader, sie selbst zu laden. Der Vorteil des übergeordneten Modus besteht darin, dass Java-Klassen eine priorisierte hierarchische Beziehung zu ihren Klassenladern haben. Beispielsweise wird die Klasse Object in rt.jar gespeichert, unabhängig davon, welcher Klassenlader diese Klasse lädt, sie wird schließlich an die Startklasse oben im Modell delegiert. Daher kann das Laden der Object-Klasse weiterhin gewährleistet werden in einer Umgebung, in der das Programm mehrere Klassenlader derselben Klasse verwendet. Im Gegenteil, wenn das übergeordnete Modell nicht verwendet wird, kann der Benutzer selbst eine Objektklasse schreiben, was zu mehreren verschiedenen Objektklassen im System führt. Auf diese Weise kann das grundlegendste Verhalten im Java-Typsystem nicht garantiert werden.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Klassenladers basierend auf der Java-Klassenlademethode. 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