Kurze Einführung in ClassLoader – Teil 3
Ein eigener ClassLoader muss von java.lang.ClassLoader ableiten und sollte die findClass-Methode überschreiben. Diese Methode benötigt den vollständigen Klassennamen und gibt die geladene Klasse in Form eines Class Objektes zurück.
Der nachfolgende ClassLoader MyClassLoader lädt die Klassen aus einem übergebenen Dateipfad. Wie in Java üblich, wird die Packagestruktur auf das Filesystem übertragen (d.h. die Klasse ch.javablog.reloadable.MyTest liegt unter ../ch/javablog/reloadable).
Im Konstruktor von MyClassLoader wird der “parent class loader” übergeben, damit der Delegationsmechanismus funktionieren kann. Erst wenn der “parent class loader” die zu ladende Klasse nicht finden konnte, wird unsere findClass-Methode aufgerufen. Dort lesen wir das “.class”-File ein und erzeugen ein byte-Feld (Zeile 23-29).
Dieses byte-Feld wird für die Methode defineClass der Oberklasse benötigt, denn sie macht die eigentliche Arbeit und generiert aus dem byte-Feld eine Java Klasse
ch.javablog.MyClassLoader:
- super(parent);
- this.startPath = startPath;
- }
- // Absoluten Pfad zur Klasse finden
- while (it.hasNext()) {
- path.append(fileSeparator + pathFragment);
- }
- path.append(".class");
- // Klasse aus Datei laden
- int fileLength = (int) classFile.length();
- byte[] fileContent = new byte[fileLength];
- FileInputStream fis = null;
- try {
- fis.read(fileContent);
- // Erzeugt aus dem byte Feld ein Class Object.
- return super.defineClass(name, fileContent, 0, fileLength);
- } finally {
- if (fis != null) {
- try {
- fis.close();
- }
- }
- }
- }
- }
In einer kleinen Main-Methode probieren wir MyClassLoader aus. Wichtig: Die Klasse ch.javablog.reloadable.MyTest befindet sich nicht im CLASSPATH, sondern in dem Verzeichnis “myclasses” (parallel zum “classes” Verzeichnis).

ch.javablog.Main :
- Class myTest = clNew.loadClass("ch.javablog.reloadable.MyTest");
- }
Ausgabe:
MyClassLoader - loading: .\myclasses\ch\javablog\reloadable\MyTest.class
class ch.javablog.reloadable.MyTest classloader: ch.javablog.MyClassLoader@923e30
Interpretation:
Die MyTest wurde erfolgreich von MyClassLoader geladen. Wenn MyTest weitere Klassen importiert, werden sie ebenfalls von MyClassLoader geladen. Die untere Abbildung zeigt die Position unseres ClassLoaders in der ClassLoader-Hierarchie.

Im nächsten Teil geht es um die ClassLoader im Apache Tomcat, und warum er einen anderen Delegationsmechanismus einsetzt.
December 6th, 2006 at 10:27 pm
Hi!
Sehr schönes Einstiegs-Tutorial in Java’s ClassLoader Prinzip,
Eine kleine Sache:
Der Parameter für String.split(..) im MyClassLoader Zeile 12 muss “\\.” sein.
Der Backslash escaped den zweiten Backslash, sodass der Regex “\.” bekommt und nicht nur “.”
btw. “\.” geht auch net..
Schöne Grüße aus Hannover (de),
Toni
December 7th, 2006 at 12:17 am
Hallo Toni
Hier hat das Wordpress-Plugin den zweiten Backslash fälschlicherweise nicht escaped. Ist nun korrigiert
Vielen Dank für den Hinweis.
Beste Grüsse aus St. Gallen
Heiko