Defaultclassloader einsetzen

Lastlord

Mitglied
Hi,
ich habe noch nie manuell mit Classloadern gearbeitet.
Bei den Beispielen, die ich bisher gesehen habe wurde aber der Classloader nur zum Laden einer Klasse verwendet.
Ich möchte allerdings in meinem Programm die Möglichkeit haben, für jede meiner Klassen einzeln zu bestimmen, wie sie geladen werden soll (mit einem eigenen Classloader).
In vielen Fällen würde ein Urlclassloader zum Einsatz kommen.

Wenn ich nun aber vor jeder Instanzierung extra einen(bzw. meinen) Classloader beschaffe, sieht das schlimm aus und ist ein riesen Aufwand.
Gibt es nicht eine Möglichkeit, soetwas wie einen Defaultclassloader einzusetzen, der für alle normal Instanzierten Klassen zum Einsatz kommt?

Ich bin dankbar für jede Hilfe(Tipps, Links,Code ).
 
Die Java ClassLoader sind sowieso als eine Chain of Responsibility ausgelegt ("Parent Delegation Model" in [1]).
Der ClassLoader am weitesten oben erhält darin zuerst die Möglichkeit, den Typ zu definieren.
Der selbstdefinierte ClassLoader erhält als Parent einfach den SystemClassLoader(siehe [2]). Der könnte dann das Parent-Delegation Modell brechen.
[3] liest sich ganz nett zum Thema.

[1] http://www.artima.com/insidejvm/ed2/linkmodP.html
[2] http://www.developer.com/java/other/article.php/10936_2248831_2/Java-Class-Loading-The-Basics.htm
[3] http://openbook.galileodesign.de/javainsel5/javainsel08_005.htm
 
Hallo,

Gibt es nicht eine Möglichkeit, soetwas wie einen Defaultclassloader einzusetzen, der für alle normal Instanzierten Klassen zum Einsatz kommt?

Es wird der ClassLoader für das Laden von abhängigen Klassen A_K verwendet der die Klasse geladen hat in der die A_K verwendet werden.

Beispiel.

Eine Anwendung erzeugt einen URLClassLoader der als URL den Pfad zu einem Verzeichnis X mit Klassen bekommt die nicht für AppClassLoader sichtbar sind.

Wird nun über diesen URLClassLoader eine neue Klasse geladen eine Instanz erzeugt und darin Code ausgeführt der beispielsweise neue Objekte Instanziiert mit Klassen die nur unterhalb des Verzeichnisses X vorhanden sind wird der URLClassLoader verwendet. Werden dort Objekte instanziiert, die auch vom AppClassLoader aus sichtbar sind, werden sie auch über diesen geladen.

Somit kann man schon sagen, dass man den "DefaultClassLoader" in gewissen Kontexten austauschen kann.

Aber warum der ganze Aufwand?

Wenn du gleich ein anständiges Modulsystem verwendest sparst du dir eine Menge Probleme. Möglichkeiten gibt es dazu genug: OSGi, Java ServiceLoader etc.

Schau mal hier:
http://www.tutorials.de/forum/java/310207-eine-art-plugin-system-2.html

Gruß Tom
 
Zurück