, der Klassenlader, der das Laden einer Klasse initiiert, wird von der JVM als initiierender Klassenlader aufgezeichnet. Weiterhin wird gemäß der JavaDoc von ClassLoader#findLoadedClass() die MethodefindLoadedClass() gibt null zurück
Gibt die Klasse mit dem angegebenen Namen der Binärdatei wenn diese Lader durch die Java Virtual Machine als initiierende loader einer Klasse mit dem Namen der Binärdatei aufgezeichnet wurde.
(Hervorhebung von mir)
Betrachten wir ein einfaches Klassenlader
class SimpleClassLoader extends ClassLoader {
void foo() {
System.err.println(loadClass("foo.Bar"));
System.err.println(findLoadedClass("foo.Bar"));
}
}
Da foo.Bar
existiert tatsächlich im Klassenpfad, new SimpleClassLoader().foo()
druckt
class foo.Bar
null
die Gründe Nach gegeben oben, sollte SimpleClassLoader
der initiierende Klassenlader und 012.350.sollte nur die erfolgreich geladene Klasse zurückgeben.
nun diese zweite Version betrachten:
class SimpleClassLoader2 extends ClassLoader {
SimpleClassLoader2() {
super(null); // disables delegation
}
protected Class<?> findClass(String name) {
try {
byte[] b = IOUtils.toByteArray(new FileInputStream("path/to/foo/Bar.class"));
return defineClass("foo.Bar", b, 0, b.length);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
void foo() {
System.err.println(loadClass("foo.Bar"));
System.err.println(findLoadedClass("foo.Bar"));
}
}
Diese SimpleClassLoader2
sowohl die Initiierung sowie die Definition von Klassenlader von foo.Bar
macht. Tatsächlich jetzt new SimpleClassLoader2().foo()
die
class foo.Bar
class foo.Bar
So gewünschten druckt entweder die Dokumentation ist falsch oder ich verstehe nicht, warum SimpleClassLoader
nicht als initiierende Klassenlader von foo.Bar
angesehen wird. Kann jemand bitte etwas Licht in das werfen?
Welchen Klassenlader erben Sie? Ich frage, weil im ersten Fall von SimpleClassLoader würde ich eine ClassNotFoundException erwarten (gegeben findLoadedClass ruft findClass, aber ich bin mir nicht sicher). –
Dies ist nicht der Fall, weil das Delegieren zuerst an das übergeordnete Element erfolgt. Wenn ich in der ersten Version den Elternwert auf null setzen würde, wäre das korrekt. – musiKk
Die Standardimplementierung von findClass wirft die Ausnahme auf: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/ClassLoader.java#ClassLoader. findClass% 28java.lang.String% 29 –