URLClassLoader & asSubclass

speedy_g

Mitglied
Moin,

meine Aufgabenstellung ist, daß ich mit einem Programm aus einem externen JAR Klassen (KlasseA) laden möchte. Desweiteren möchte ich aus dem gleichen JAR Klassen finden, die von KlasseA abgeleitet sind.


Einmal habe ich das Laden der Klasse:

Java:
public static Class<?> getClass(String className, String jarFile)
{
	Class<?> clazz = null;
		
	File file = new File(jarFile);

	try
	{
		URL[] url = new URL[] { file.toURI().toURL() };
		URLClassLoader ucl;
	
		ucl = new URLClassLoader(url);
		clazz = ucl.loadClass(className);
	}
	catch( MalformedURLException e )
	{
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	catch( ClassNotFoundException e )
	{
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	return clazz;
}


In einer weiteren Methode lade ich die Elternklasse und die zu prüfende Klasse und hoffe daß es paßt. Ich lasse mal das ganze drumrum weg. Ich habe desweiteren noch Methoden, die mir die Klassennamen inkl. Package aus dem Jar-File auslesen und die gehe ich dann in einer Schleife durch und teste jede gegen die Elternklasse.

Java:
parentClass = getClass( parentClassName, jarFile );

testClass = getClass( testClassName, jarFile );

Class<?> subClass = testClass.asSubclass( parentClass );

Beim asSubclass fliegt er mir jetzt aber mit einer ClassCastException raus. Bei "falschen" Klassen korrekt. Aber er tut dies auch bei den "richtigen" Klassen, die wirklich von parentClass abgeleitet sind.


Jemand eine Idee, was ich falsch mache ?


Als ich dieses externe JAR noch komplett mit in meinem Programm drin hatte und den Standard ClassLoader verwendet hatte, hatte das funktioniert.



MFG
speedy
 
S

SlaterB

Gast
vielleicht hilft es, wenn du irgendwo zum String jarFile den URLClassLoader speicherst, damit du denselben wiederverwendest,
nicht jedesmal einen neuen,
testweise reicht eine einfache statische Variable

schau dir aber durchaus auch getSuperClass() an, ist wenigstens deren Name wirklich gleich dem der parentClass?
 

speedy_g

Mitglied
testweise reicht eine einfache statische Variable

Nichts leichter als das - der Rest der Klasse ist ein Singleton. :)

vielleicht hilft es, wenn du irgendwo zum String jarFile den URLClassLoader speicherst, damit du denselben wiederverwendest,
nicht jedesmal einen neuen,

Genau das war es.

Wobei ich nicht verstehe, wieso er sonst ein Problem hat - das Package etc. paßt doch trotzdem ? - also die Regeln, ob die Klasse eine abgeleitete ist.



MFG
speedy
 
S

SlaterB

Gast
getrennte ClassLoader dienen ja gerade auch zum separaten Laden gleichnamiger Klassen, etwa in aktualisierter Version,
da muss also schon eine Unterscheidung möglich sein,
sicher war ich mir gerade nicht, ob die gleiche Quelle geprüft wird und irgendwie Einfluss hat, ist ja exakt dasselbe Jar
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen

Neue Themen


Oben