Frage

Kann mir jemand eine gute Ressource Punkt oder mich hinter der Klasse Lader über das Konzept erklären? Ich fand die folgende Ressource auf Klassenlader http://www.onjava.com/lpt/a/5586 aber immer noch keine Hilfe. Die folgenden Fragen können albern aussehen, sondern versuchen, sie zu beantworten, immer verwirrt mich.

  • Warum Entwickler tun benutzerdefinierte Classloader schreiben, rufen Sie warum nicht eine Bootstrap Class Loader Ihre benutzerdefinierten Klassen aufrufen? Was ist die Notwendigkeit benutzerdefinierten Klassenlader zu definieren?
  • Warum gibt es so viele Sorten von Klassenlader? zB:. Bootsrap, Comman, Catalina Klassenlader usw.,

    Vielen Dank im Voraus.

War es hilfreich?

Lösung

Ich fand die folgenden, gute Gründe, benutzerdefinierte Classloader zu erstellen:

  1. Sie mögen eine Klasse aus einer unkonventionellen Quelle (zum Beispiel zum Laden der Bytecode für eine Klasse in einer Datenbank gespeichert ist, über das Netzwerk oder durch als 0 und 1 s durch pidgeons - MessengerPidgeonClassLoader). Es gibt einige Implementierungen Classloader bereits in der API für solche Fälle, wie URLClassLoader .

  2. Sie brauchen eine andere Hierarchie definieren Klassen zu laden. Standardimplementierungen der Classloader delegieren die Suche zunächst auf die Eltern, dann versuchen sie, die Klasse selbst zu laden. Vielleicht möchten Sie eine andere Hierarchie. Dies ist der Grund, warum OSGi und Eclipse seine eigenen Classloader haben als die Manifest .MF Dateien alle Arten von seltsamen Hierarchie Pfade definieren (Buddy-Classloading, zum Beispiel). Alle Eclipse-Klassenlader die BundleClassLoader-Schnittstelle implementieren und einige zusätzliche Code haben Ressourcen zu finden innerhalb von Eclipse Plugins.

  3. Sie müssen einige Änderungen an den Bytecode zu tun. Vielleicht ist der Bytecode verschlüsselt, und Sie werden es im laufenden Betrieb ( Nicht, dass es hilft, wirklich, aber wurde versucht ). Vielleicht möchten Sie die Klassen "Patch" geladen on the fly (A la JDO Bytecode Enhancement).

Die Verwendung eines anderen Klassenlader als das System Classloader ist erforderlich, wenn Sie Klassen aus dem Speicher entfernen müssen, oder Klassen zu laden, als ihre Definition zur Laufzeit ändern. Ein typischer Fall ist eine Anwendung, die eine Klasse on the fly aus einer XML-Datei, zum Beispiel erzeugt, und dann versucht, diese Klasse zu laden. Sobald eine Klasse im System-Classloader ist, gibt es keine Möglichkeit, es zu entladen und eine neue Definition haben.

Andere Tipps

Eine gemeinsame Verwendung von Classloader ist eine JAR zu isolieren. Wenn Sie eine Anwendung haben, die Plugins verwendet ( Eclipse-, Maven 2 ), dann können Sie diese Situation haben: Plugin X muss jar A mit Version 1.0, während Plugin Y das gleiche Glas, aber Version 2.0 benötigen. X läuft nicht mit der Version 2.0, though.

Wenn Sie Classloader haben, können Sie Partitionen von Klassen erstellen (man denke an isolierten Inseln durch dünne Brücken verbunden sind, die Brücken sind die Klassenladeprogramme). Auf diese Weise können die Klassenladeprogramme steuern, was jedes Plugin sehen.

Wenn X Plugin eine Klasse Foo instanziiert, die statischen Felder hat, ist dies kein Problem, und es wird keinen mixup mit der „gleichen“ Klasse in Plugin Y sein, weil jeder Klassenlader in der Tat wird eine eigene Instanz der Klasse erstellen foo. Sie haben dann zwei Klassen im Speicher, wo cl1.getName().equals(cl2.getName()) true ist aber cl1.equals(cl2) nicht. Dies bedeutet, dass Fälle von CL1 sind nicht kompatibel Zuordnung zu Instanzen von Cl2. Dies kann zu seltsamen ClassCastExceptions führen, die sagen, dass org.project.Foo nicht org.project.Foo zugeordnet werden.

Wie bei abgelegenen Inseln sind die beiden Klassen nicht bewusst, dass der andere existiert. Denken Sie an den menschlichen Klone, die geboren werden und dann auf verschiedene Inseln erhoben. Aus der Sicht der VM, gibt es kein Problem, weil Instanzen des Typs Klasse wie jedes andere Objekt behandelt werden: Es gibt mehrere von ihnen sein kann. Dass Sie denken, dass einige von ihnen sind „die gleiche“ nicht an die VM Rolle.

Eine andere Verwendung für dieses Muster ist, dass Sie auf diese Weise geladen loswerden Klassen bekommen kann: einfach sicher, dass niemand einen Zeiger auf ein beliebiges Objekt von Klassen aus einem Klassenlader geladen erstellt hat und dann über den Klassenlader vergessen, auch. Bei der nächsten Ausführung des GC rel="noreferrer">

Sie können nicht über die rohe Quelle gehen, in Fällen wie diesem. Wenn Sie wirklich wollen die Innen dope, die hard core , lesen Sie die entsprechenden Bits der Java Virtual Machine Specification .

Eine weitere gute Verbindung für Java-Klassenlader - Java Classloader

Es ist extrem selten, dass Sie Ihre eigenen Classloader erstellen müssen. Und genereally, wenn Sie benötigen, sollten Sie bereits ein wirklich gutes Verständnis dessen, was die Classloader tut.

Mit anderen Worten, wenn Sie fragen, warum Sie benötigen, um Ihre eigenen Classloader zu erstellen, dann brauchen Sie nicht zu erstellen;)

Dass gesagt wird, ich habe auch einen Classloader ist für eine Anwendung erstellt gesehen, die mit Kryptographie behandelt. Auf diese Weise jedes Mal, erstellen Sie eine java.netSocket oder irgendeine Art von Datei / Stream-Objekt, statt der JVM-Versionen verwenden sie ihre eigenen speziellen speziell angefertigten Klassen verwenden würde. Auf diese Weise können sie die garantieren, dass alle Informationen verschlüsselt wurden und dass es keine Entwickler Fehler.

Aber es ist nicht sehr verbreitet. Sie können eine ganze Java Karriere gehen, ohne jemals Ihre eigenen Classloader zu benötigen zu erstellen. Eigentlich, wenn Sie erstellen müssen, sollten Sie wirklich fragen, ob es notwendig ist.

  

Warum Entwickler benutzerdefinierte Klasse Lader schreiben, rufen Sie warum nicht eine Bootstrap Class Loader Ihre benutzerdefinierten Klassen aufrufen? Was ist die Notwendigkeit benutzerdefinierten Klassenlader zu definieren?

Abhängig von der Anwendung, können die Entwickler außer Kraft setzen oder ganz die Klasse Lademechanismus ersetzen ihre Bedürfnisse anzupassen.

Zum Beispiel habe ich eine Anwendung, der Klassen verwendet werden, aus einem LDAP geladen: S

Andere Anwendungen müssen unabhängige Klassen Verwaltung (wie die meisten der Anwendungsserver, die hot-deploy unterstützen)

Sie über Ressourcen, es gibt TONNEN, in der Bahn, das kann einfach nicht aufgeführt werden.

Ein Beispiel:

Tomcat verwendet angepassten WebAppClassloader zu laden und isolieren Klassen / Dosen aus verschiedenen Web-Anwendungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top