Java-Klassenladevorgang
Der erste ist der Ladevorgang (Loading), bei dem Java Bytecode-Daten aus verschiedenen Datenquellen liest. Holen Sie es sich in die JVM übertragen und einer von der JVM erkannten Datenstruktur (Klassenobjekt) zuordnen, z. B. in JAR-Dateien, Klassendateien oder sogar in Netzwerkdatenquellen, wenn die Eingabedaten nicht ClassFile sind Struktur, ClassFormatError wird geworfen. Die Ladephase ist die Phase, in der Benutzer teilnehmen. Wir können den Klassenlader anpassen, um unseren eigenen Klassenladeprozess zu implementieren.
Die zweite Stufe ist die Verknüpfung, der Kernschritt, der darin besteht, die ursprünglichen Klassendefinitionsinformationen reibungslos in den laufenden JVM-Prozess zu übertragen. Dies kann weiter in drei Schritte unterteilt werden: 1. Überprüfung, die eine wichtige Garantie für die Sicherheit der virtuellen Maschine darstellt. Die JVM muss überprüfen, ob die Byte-Informationen der Java Virtual Machine-Spezifikation entsprechen, andernfalls wird sie als VerifyError betrachtet Verhindern Wenn schädliche oder nicht konforme Informationen den Betrieb der JVM beeinträchtigen, kann die Überprüfungsphase das Laden weiterer Klassen auslösen. 2. Vorbereitung (Pereparation): Erstellen Sie statische Variablen in der Klasse oder Schnittstelle und initialisieren Sie die Anfangswerte der statischen Variablen. Es gibt jedoch einen Unterschied zwischen der „Initialisierung“ hier und der Anzeigeinitialisierungsphase unten. Der Schwerpunkt liegt auf der Zuweisung des erforderlichen Speicherplatzes und es werden keine weiteren JVM-Anweisungen ausgeführt. 3. Lösung In diesem Schritt wird die symbolische Referenz im Konstantenpool durch eine direkte Referenz ersetzt. In der Java Virtual Machine Specification wird die Analyse verschiedener Aspekte wie Klassen, Schnittstellen, Methoden und Felder ausführlich vorgestellt.
Der letzte Schritt ist die Initialisierungsphase. In diesem Schritt wird tatsächlich die Codelogik der Klasseninitialisierung ausgeführt, einschließlich der Aktion der statischen Feldzuweisung und der Ausführung der Logik im statischen Initialisierungsblock Der Compiler führt die Kompilierungsphase durch. Dieser Teil der Logik wird aussortiert, und die Initialisierungslogik des übergeordneten Typs hat Vorrang vor der Logik des aktuellen Typs. Lassen Sie uns über das übergeordnete Delegationsmodell sprechen. Wenn der Loader (Class-Loader) versucht, einen bestimmten Typ zu laden, versuchen Sie, die Aufgabe an den übergeordneten Typ des aktuellen Loaders zu delegieren, es sei denn, der übergeordnete Klassenlader kann den entsprechenden Typ nicht finden. Werkzeuge, um es zu tun. Der Zweck der Verwendung des Delegationsmodells besteht darin, das wiederholte Laden von Java-Typen zu vermeiden.
Häufige Szenarien benutzerdefinierter Klassenlader
Um eine ähnliche In-Process-Isolation zu erreichen, wird der Klassenlader tatsächlich als anderer Namespace sowie zur Bereitstellung ähnlicher Container verwendet und Modultransformationseffekt. Beispiel: 1. Zwei Module hängen von unterschiedlichen Versionen einer bestimmten Klassenbibliothek ab. Wenn sie von unterschiedlichen Containern geladen werden, stören sie sich nicht. Meister in diesem Bereich sind Java EE und OSGL, JPMS und andere Frameworks. 2. Die Anwendung muss Klassendefinitionsinformationen aus verschiedenen Datenquellen abrufen, z. B. aus Netzwerkdatenquellen und nicht aus dem lokalen Dateisystem. 3. Oder Sie müssen den Bytecode selbst bearbeiten und den generierten Typ dynamisch ändern.
Wir können den Ladevorgang für benutzerdefinierte Klassen im Allgemeinen einfach verstehen: 1. Finden Sie die binäre Implementierung, indem Sie den Namen angeben. Dies ist häufig der Teil, den der benutzerdefinierte Klassenlader beispielsweise in bestimmten Daten „anpasst“. Quelle Bytecode nach Namen abrufen oder Bytecode ändern oder generieren. 2. Erstellen Sie dann das Klassenobjekt und schließen Sie den Ladevorgang der Klasse ab. Die Konvertierung binärer Informationen in Klassenobjekte basiert normalerweise auf defineClass. Wir müssen sie nicht selbst implementieren. Mit dem Class-Objekt wird der nachfolgende Ladevorgang reibungslos abgeschlossen.
Empfohlenes Tutorial: „Java-Tutorial“
Das obige ist der detaillierte Inhalt vonLadevorgang der Java-Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!