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.