Klassenlader
Der Java -Klassenlader soll die erforderlichen Klassen in der Laufzeit dynamisch in der JVM laden. Der Java -Klassenlader basiert auf drei Mechanismen: Delegierter, sichtbar und Single.
Laden Sie die .class -Dateien unter dem Klassenpfad in den Speicher und verarbeiten Sie sie in Bytecode. Diese Aufgaben werden vom Klassenlader ausgeführt.
Standardklassenloader
Das System ist standardmäßig drei Klassenlader:
Der Klassenlader ist auch eine Java -Klasse, aber Bootstrap ist es nicht. Bestätigungscode:
public class ClassloadTest {public static void main (String [] args) {System.out.println (System.class.getClassloader ()); }}Ausgabe: NULL
If system.out.println (system.class.getClassloader (). ToString); Es wird verwendet, eine Ausnahme von Nullzeiger wird gemeldet:
Ausnahme im Thread "Haupt" java.lang.nullpointerexception unter com.iot.classloader.classloadtest.main (classloadtest.java:10) bei sun.reflect.nativemethOccessorimpl.invoke0 (native Methode) bei sun.reflect.nativemethodaccessorimpl.invoke (nativemethodaccessorimpl.java:62) at sun.reflect.delegatingMethodaccessorImpl.invoke (DelegatingMethodaccessorimpl.java:43) bei java.lang.lang.rang. com.intellij.rt.execution.application.appmain.main (Appmain.java:144)
Wie zu sehen ist, wird die Systemklasse vom Bootstrap -Klassenloader geladen.
Klassenlader -Delegiertermechanismus
Baumdiagramm des Klassenladers
Klassenlader
Die allgemeine Reihenfolge der Ladeklassen:
So schreiben Sie einen benutzerdefinierten Klassenlader
API:
Klassenloader
Vorlagenmethode Entwurfsmuster
Elternklasse:
LoadClass (Klassenbeladungsprozess, Vorlage)
Die Ladelogik für FindClass -Klasse für Unterklassenüberschreibungen, die nach LoadClass -Methode aufgerufen wurden.
Definition
Unterklasse: Überschreien -FindClass -Methode
Beispiel:
Der Quellcode der LoadClass -Methode
Protected Class <?> LoadClass (String -Name, boolean Resolve) löst classNotFoundException {synchronized (GetClassLoadingLock (Name)) {// Erstens prüfen, ob die Klasse bereits geladen wurde. if (c == null) {long t0 = system.nanotime (); try {if (parent! = null) {c = parent.loadClass (Name, false); } else {c = findbootstrapCassOrnull (name); }} catch (classNotFoundException e) {// classNotFoundException, wenn die Klasse nicht gefunden wird // aus dem Nicht-Null-Elternklassen-Loader} if (c == null) {// Wenn immer noch nicht gefunden wird, rufen Sie die Fundklasse in der Reihenfolge // auf, um die Klasse zu finden. long t1 = system.nanotime (); C = FindClass (Name); // Dies ist der definierende Klassenlader; Notieren Sie die Statistiken Sun.misc.PerfCounter.getParentDelegationTime (). sun.misc.perfcounter.getFindClasstime (). AddelapsedTimeFrom (T1); sun.misc.perfcounter.getfindclasses (). Increment (); }} if (Resolve) {ResolVeclass (c); } return c; }}Beispiele in der API -Dokumentation:
class NetworkClassloader erweitert den Classloader {String -Host; int Port; public class findClass (String name) {byte [] b = loadClassData (Name); Rückgabe definClass (Name, B, 0, B.Length); } private byte [] LoadClassData (String -Name) {// Die Klassendaten aus der Verbindung laden. . . }}