Java class loading Wie die JVM Klassen läd Ein Exkurs in der Reihe “Let's Build a compiler” Yannik Hampe (a.k.a. yankee) Quellen von Klassen ● ● Klassen (bzw. .class-Dateien) können kommen aus...: – ... dem Dateisystem – ... einer JAR-Datei – ... dem Netzwerk – ... oder einer benutzerdefinierten Quelle Nahezu unendliche Möglichkeiten entstehen wenn man sich seinen eigenen ClassLoader schreibt. Das übliche Szenario ● Die JVM führt code aus und findet dabei folgende Instruktion: – ● ● getstatic java/lang/System/out Ljava/io/PrintStream; Die JVM findet in dieser Instruktion zwei Klassen die sie laden muss: – java.lang.System – java.io.PrintStream Die JVM beauftragt den ClassLoader beide Klassen zu laden. Die drei class loader ● Folgende class loader werden in folgender Reihenfolge aufgerufen: 1. Bootstrap class loader Für Java Kernbibliotheken (String, Integer, Collection, System, ...) 2. Extensions class loader ● JRE Erweiterungen aus dem Ordner <JAVA HOME>/lib/ext 3. System class loader ● ● Läd Klassen vom CLASSPATH. Die drei class loader ● Folgende class loader werden in folgender Reihenfolge aufgerufen: 1. Bootstrap class loader Für Java Kernbibliotheken (String, Integer, Collection, System, ...) 2. Extensions class loader ● JRE Erweiterungen aus dem Ordner <JAVA HOME>/lib/ext Den System class loader 3. System class loader wollen wir im folgenden ● Läd Klassen vom CLASSPATH. näher betrachten ● Das übliche Szenario (2) ● Der class loader durchsucht den “CLASSPATH” nach den gewünschten Klassen. Angenommen: Pfadtrenner (Linux ':', Windows ';') – ● CLASSPATH=.:/some/path:/path/to/archive.jar Dann sucht der ClassLoader nach der .class Datei der Klasse package.MyClass an folgenden Stellen in folgender Reihenfolge: Aktuelles Arbeitsverzeichnis – ./package/MyClass.class – /some/path/package/MyClass.class – package/MyClass.class in der zip-Datei /path/to/archive.jar Gesuchte Klasse Woher der CLASSPATH kommt ● Aus der Systemvariable CLASSPATH ● Aus der Kommandozeilenoption “-cp” – ● ● java -cp .:/ein/pfad:/ein/andererPfad MeineKlasse Auch der Javacompiler “javac” hat die Option “-cp” um den Classpath anzugeben Statt “-cp” kann man auch “-classpath” schreiben. Wann Java Klassen laden lässt ● Beim Kompilieren jede verwendete Klasse – ● ● System.out.println(“Hello World”); läd drei Klassen. Welche sind es? Beim Ausführen jede aufgerufene Klasse Das Laden einer Klasse kann dazu führen das viele weitere Klassen geladen werden: – class MeineKlasse extends DeineKlasse ● Wenn “MeineKlasse” geladen wird, wird auch “DeineKlasse” geladen. Wann wir für ANTLR Klassen laden ● antlr4 Demo.g4 -no-listener -visitor – ● javac *.java – ● Braucht nur ANTLR-Klassen. Diese sind im antlr.jar enthalten → antlr.jar muss auf dem CLASSPATH sein. Einige der generierten .java Dateien verwenden ANTLR-Klassen → Wieder wird antlr.jar im CLASSPATH benötigt. grun Demo start -gui – grun ist ein ANTLR-Programm aus dem antlr.jar → Dieses wird im CLASSPATH benötigt – grun versucht die Klassen “DemoLexer” und “DemoParser” die von “javac” vorhin erzeugt wurden zu laden. Diese müssen auch im CLASSPATH sein.
© Copyright 2024 ExpyDoc