Classloader Problem

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo zusammen

Ich versuch mal mein Problem zu beschreiben:

Gegeben ist ein jar-file, welches ich in mein Projekt eingebunden habe. In meinem Projekt habe ich nun eine Klasse erstellt wie sie bereits im jar enthalten ist (package Name und Klassenname sind identisch).

Nun ist nötig variabel eine der gewünschten Klassen zu laden.
Also entweder die abc.xyz.MyClass aus dem JAR oder direkt aus dem Projekt

Im Moment wird immer die Klasse aus dem aktuellen Projekt genommen.

Hier mein Versuch die aus der Jar zu nutzen:

Code:
     File file = new File("./lib/myPackage.jar");
     url = file.toURI().toURL();
     URL[] urls = new URL[]{url};
     Class cls = new URLClassLoader(urls).loadClass( "abc.xyz.MyClass" );

Bin über jeder Hilfe sehr dankbar
 
Erstmal danke für den Link, aber leider nicht ganz daß was ich suche.

Vielleicht nochmal ein bissl anders erklärt: 🙂

Ich hab ein JAR, welches ich eingebunden habe.
Nun bräuchte ich für manche Sachen einen einfachen Dummy für ein im JAR befindliche Klasse.
Ich hab somit eine Klasse mit selben Namen mit gleicher Package-Struktur erstellt.

Problem ist halt, daß Java nun immer die Dummy-Klasse nimmt.
Was aber nicht immer gewollt wird.

Ich bräuchte also eine Möglichkeit um anzugeben, welche der beiden Klassen er nehmen soll.
Entweder aus JAR oder aus Projekt. Beide haben die Strucktur: abc.xyz.MyClass.
 
Um eine Klasse mit einem eigenen ClassLoader laden zu können, darf die entsprechende Klasse nicht durch den SystemClassLoader gefunden werden, also nicht im Classpath liegen.
Für was braucht man eigentlich ein solches Konstrukt?
 
Brauch das um EinzelKomponenten zu testen.

Ich muss halt Komponenten durch MOCKs ersetzen um diese dann auszuwerten.
Aber für den Testen muß/darf ich nur vordefinierte Klassen durch MOCKs ersetzen.
 
Hab mal noch ein bissl gelesen, wie es gehen könnte.

Die Theorie denk ich ein bissl verstanden zu haben, aber an der Umsetzung scheiterts im Moment.

Hiermal noch ein Link: Java Insel


Das müsste (denk ich) gemacht werden:
- Eigenen Classloader schreiben, der die Klasse aus dem JAR läd und das "Linking" macht
- Es muß vermieden werden, daß Bootstrap-, Erweiterungs- und System-Klassenlader ausgeführt/verwendet werden,
da die wieder die Klasse vom Projekt (Dummy) verwenden würden.

Jeder Klassenlader L hat dazu einen Vater-Klassenlader V. Erst darf der Vater versuchen, die Klassen zu laden. Kann er es nicht, gibt er die Arbeit an L ab.


Ist das soweit theoretisch richtig?

und...
1) wie ermöglicht man das Linking in einem Classloader (werd aus denen im JDK nicht schlau)?
2) welche Methoden muß ich vom Classloader überschreiben?
3) wie verbiete ich daß durchsuchen durch die anderen "drüberliegenden" Classloader?
 
Du kannst ganz einfach den URLClassloader verwenden, musst wie gesagt aber dafür sorgen das die zu ladende Klasse nicht im Classpath liegt.
 
Wildcard hat gesagt.:
... dafür sorgen das die zu ladende Klasse nicht im Classpath liegt.

Genau da liegt das Problem, denn sowohl das JAR sowie die Dummys sind im Projekt sichtbar. :bahnhof:
 
Evtl. kann man so ein Problem besser per Instrumentation lösen; dabei kann man dafür sorgen, dass Klassen beim Laden, also zur Laufzeit, nachträglich verändert werden. Das ist aber ein ziemlich komplexes Thema.
 
Man kann eine Klasse doch auch über einen ClassLoader direkt ansprechen? Ohne das ich das jetzt hier alles gelesen und verstanden habe, aber man kann eine klasse doch auch über den ClassLaoder selbst laden. Da ist es dann egal, ob die Klassen im Bootstrap liegen oder nicht. Wenn Du einen CL für deine JAR-Dateien hast, dann benutze diesen um eine Klasse zu lasen und Du hast ganz sicher diese. Dann kann man allerdings auch keine Schnittstellen oder sowas aus dem System-CL benutzen um diese dann anzusprechen. Das wird nie gehen..
 
Nein, ein Classloader leitet immer zuerst an den Parent weiter (aus Sicherheitsgründen).
Wenn der Parent die Klasse findet kommt der Child-Classloader nicht zum Zug.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben