Mit Ausnahme des Bootstrap-Klassenladers werden alle Klassenlader von einer übergeordneten Klasse abgeleitet. Im Wesentlichen ist das genau die Klassenlader-Instanz, die wiederum den betreffenden Klassenlader geladen hat. Das Wichtigste dabei ist, diesen sogenannten Parent-Klassenlader korrekt festzulegen. Danach kann man die Methode getParent() des Klassenladers verwenden, um Anfragen nach Klassen an ihn weiterzuleiten. Das empfiehlt sich beispielsweise, wenn der eigene Klassenlader mit den spezifizierten Methoden eine Klasse nicht finden kann. Den Parent-Klassenlader muss man im Konstruktor als Parameter für den java.lang.ClassLoader-Konstruktor angeben:
Die Methode loadClass(String name) bildet den Einstiegspunkt für den Klassenlader. Der Parameter name ist dabei ein vollständig qualifizierter Klassenname (FQCN), also ein Klassenname samt Paketangabe. Ist der Parent-Klassenlader korrekt angegeben, wird er zuerst gefragt, wenn MyClassLoader eine Klasse per loadClass(String name) laden soll, diese aber nicht findet.
Falls der übergeordnete Klassenlader die Klasse auch nicht finden kann, wird die Methode findClass(String name) aufgerufen. Die Standardimplementierung von findClass(String name) löst normalerweise den Ausnahmefehler ClassNotFoundException aus. Die meisten Entwickler dürften mit diesem schon hinreichend Bekanntschaft gemacht haben. Entwickler von eigenen Klassenladern sollten diese Methode aufheben, wenn sie java.lang.ClassLoader übernehmen.
Zweck der Methode findClass() ist es, allen speziellen Code für MyClassLoader aufzunehmen, ohne sonstigen Code zu duplizieren, etwa beim Aufruf des System-Klassenladers, wenn der eigene Klassenlader nicht funktioniert. Bei dieser Methode muss der Klassenlader den Bytecode von einer beliebigen Quelle abrufen können. Sobald der Bytecode abgerufen ist, sollte die Methode defineClass() aufgerufen werden. Es ist extrem wichtig, welche Klassenlader-Instanz die Methode für die geladene Klasse aufgerufen hat. Wenn also zwei Klassenlader-Instanzen Bytecode aus derselben Quelle oder unterschiedlichen Quellen definieren, werden die definierten Klassen als unterschiedlich behandelt.
Neueste Kommentare
Noch keine Kommentare zu Mit maßgeschneiderten Klassenladern lästige Fehler in Java vermeiden
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.