Welche Gründe hatten die Menschen schreiben Ihre eigenen classloader
Ich war vor kurzem in einem interview gefragt, über die Reihenfolge, in der die classloadern, die aufgerufen werden, wenn eine Klasse geladen wird.
Leider hatte ich nie das Bedürfnis zu schreiben, meine eigenen classloader, so war zu der Zeit nicht vertraut mit den Feinheiten zum laden von Klassen.
Dieser hat mich gefragt, was die Gründe sind, Ihre eigene zu schreiben classloader.
Also das ist meine Frage: Szenarien, Was die Menschen gemacht haben, konfrontiert, was die brauchen, to schreiben Sie Ihre eigenen classloadern?
- In sehr einfachen Worten, Standard-class-loader, die mit JRE laden können Klassen aus classpath (file systems), URLs (z.B. sockets Applet class loader, RMI class loader) etc. Wenn diese nicht ausreichen oder nicht, laden Sie Ihre Klassen richtig (z.B. verschiedene Versionen der gleichen Klasse, die geladen werden müssen), die Sie benötigen, um schreiben Sie Ihre eigenen benutzerdefinierten class loader.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich arbeite aktuell an einer sehr großen Anwendung, ist hochgradig modularisiert, d.h. es besteht aus buchstäblich Hunderte von JAR-Dateien. Dies bedeutete, dass die classpath-string wurde riesige, verursacht alle möglichen Probleme in allen möglichen Plätzen, weil von verschiedenen Entwicklungs-tools, die Unfähigkeit, sich mit einem 5KB classpath-string. Dies wurde gelöst, indem das schreiben von benutzerdefinierten classloader, der liest seine classpath aus einer Datei.
Typischer Grund ist, dass Ihre Anwendung-hosting anderen Anwendungen, die gleichen Bibliotheken in unterschiedlichen Versionen in der gleichen Laufzeit (z.B. Tomcat). So haben Sie, um sicherzustellen, dass Ihre classloader können verschiedene Versionen der gleichen Klasse für jede dieser Anwendungen.
BEARBEITEN:
Zur Klärung dieser ein wenig (siehe Verwirrung in den Kommentaren): Wenn Sie sagte "Ihr classloader" ich ment "eine Umsetzung der
java.lang.ClassLoader
" nicht eine Instanz einer solchen Klasse. Eigentlich ist es Ihre classloaders in beiden Bedeutungen: die Tomcat-Leute implementiert verschiedeneClassLoader
-Klassen und haben sogar mehrere Instanzen zur Laufzeit...für details siehe die entsprechende docs.Langeweile und der Wunsch, zu quälen, meine co-Arbeiter, wenn Sie zu halten hatte, meinen code. 🙂
Einige Orte speichern-Klassen in einer Datenbank (gut, es verwendet werden, um Orte, nicht sicher, ob es mehr) und verwenden Sie einen class loader, um die Klassen aus der Datenbank zur Laufzeit.
Ich hatte zu implementieren, die ein Klassenladeprogramm einmal, wenn ich wollte, zu laden, bis Klassen .jar-Dateien in einem .jar-Datei (das war vor ein paar Jahren, ich bin sicher, es gibt tools, die können das für Sie tun). also, setzen Sie Ihre Abhängigkeit .jar-Dateien in eine .jar-Datei.
Aber das ist die einzige Zeit, in der meine Erfahrung schreiben einer benutzerdefinierten ClassLoader ist eine ziemlich seltene Sache.
Haben Sie einen Blick auf diese Frage.
Stieß ich auf einen Artikel, die spricht darüber, warum (sehr kurz), OSGI verwendet einen benutzerdefinierten Classloader.
Können Sie software-Versionen ohne die Ausfallzeiten, Art der Situationen, in 24x7-Systemen.
Sie können schreiben Sie Ihre eigenen class loader-Aufruf, der von JMX und ersetzen Sie die class-Datei zur Laufzeit.
Hatten wir ein Anwendungs-framework, das hatte Anwendungen, die darauf basieren, das waren 'statisch gebunden'. Dies bedeutete, dass Sie benötigt eine jvm-Instanz pro Anwendung, die Sie ausführen wollte, das war nicht nur schlecht für den Speicher verwenden, aber bedeutete, dass Sie konnte nicht haben eine super Anwendung, von der aus Sie zum starten der verschiedenen apps, oder eine einfache (nicht-Interprozess -) Kommunikation zwischen den Laufenden apps.
Da war die ganze Sache ausführen von Java webstart (ich.e mit einer Reihe von Gläsern die classpath), die Lösung zur Verhinderung der system-classloader von der Wahl der Klassen wurde zum Ausgleich der Pakete. Beispielsweise, wenn Sie hatte eine Klasse
a.b.X
in einer Anwendung foo, dann wäre es in der jar-Datei alsfoo/a/b/X.class
.Bei meinem letzten job, den wir implementiert einen server, der hätte "plug-in logischen query-Definitionen". (Der client konnte call Abfragen von Namen, die server blickte auf die registrierten Abfrage für diesen Namen und es lief).
Den query-Definitionen wurden code-und/oder Metadaten, die in einer jar.
War das Gefäß auf den server hochgeladen, obwohl die Konsole-Anwendung.
Beim Upload (und später, wenn die server neu gestartet), der Rahmen würde eine class-loader für das Glas, um es zu laden in den Laufenden server.
Muss ich tun, dass einer Zeit. Wir haben eine API bereitstellen, die von einem Drittanbieter und diese API eine seltsame version von hibernate3.jar.
Also, wir laden hatte dieses spezielle Glas mit einem benutzerdefinierten classloader, um avoir "serial version UID" Ausnahme.
Ich gesehen habe, einen guten Beitrag hier. Er spricht über verschiedene class loader, class loader-Hierarchie und benutzerdefinierte class loader.