Kann man in Java wissen, ob eine Klasse bereits geladen wurde?
Ist es möglich zu wissen, ob eine Java-Klasse geladen wurde, ohne versucht, es zu laden? Class.forName
versucht, laden Sie das Klasse, aber ich will nicht diese Nebenwirkung. Gibt es einen anderen Weg?
(Ich will nicht das überschreiben der Klasse loader. Ich bin auf der Suche nach einer relativ einfachen Methode.)
InformationsquelleAutor der Frage Hosam Aly | 2009-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Dank Aleksi) Diesen code:
Produziert:
Beachten Sie, dass die Beispiel-Klassen sind nicht in einem Paket. Die volle binäre Namen erforderlich ist.
Ein Beispiel für eine binäre name ist
"java.security.KeyStore$Builder$FileBuilder$1"
InformationsquelleAutor der Antwort Stephen Denne
Können Sie die findLoadedClass(String) Methode ClassLoader. Es gibt null zurück, wenn die Klasse nicht geladen.
InformationsquelleAutor der Antwort Aleksi Yrttiaho
Einen Weg, dies zu tun wäre zu schreiben Sie eine Java-Agenten mithilfe der instrumentation API. Dieses würde Ihnen erlauben, zu erfassen, das laden von Klassen durch die JVM.
META-INF/MANIFEST.MF:
Der Nachteil ist, dass Sie zum laden der agent beim starten der JVM:
InformationsquelleAutor der Antwort McDowell
Wenn Sie haben die Kontrolle über die Quelle der Klassen, für die Sie sich interessieren, ob Sie geladen sind oder nicht (was ich bezweifle, aber Sie don ' T Stand in deiner Frage), dann könnte man registrieren, Ihre Ladung in einem statischen Initialisierer.
Ausgabe:
InformationsquelleAutor der Antwort Stephen Denne
Ich hatte ein ähnliches problem vor kurzem, wo ich vermutete, dass Klassen wurden nicht geladen werden kann (vermutlich durch -classpath oder so ähnlich) von meinem Benutzer, die in Konflikt mit den Klassen war ich dem laden später in meiner eigenen classloader.
Nachdem ich ein paar der Dinge, die hier erwähnt werden, das folgende schien, den trick zu tun für mich. Ich bin mir nicht sicher, ob es funktioniert für alle Fälle, es kann nur funktionieren, für die java-Klassen geladen, die aus jar-Dateien.
Wo
name
ist der Pfad zur class-Datei wiecom/blah/blah/blah/foo.class
.getResourceAsStream
zurückgegebennull
wenn die Klasse nicht geladen wurden, in meine Klasse loader, oder der system-class-loader, und kehrte nicht-null, wenn die Klasse bereits geladen wurde.InformationsquelleAutor der Antwort Eric Van Bezooijen