Interface - Klasse einladen

XeZZ

Mitglied
Hiho,

ich verzweifel hier grade daran dynamisch Klassen nachzuladen vond enen zum Programmstart nur das Interface bekannt ist.

Also ich habe mein normales programm und dann eine Datei "states.jar" Die liegt derzeit bei mir im selben Package ichd as die schon überall hingetan aber ohne Erfolg wo muss die wirklich hin? Ich will am Ende zwei *.jar Datein haben eine programm.jar (ausführbar) und eine states.jar in der sich Statusklassen befinden, die von einem der Interfaces (CellState) in der programm.jar abgeleitet sind.

So also die states.jar existiert nun wie gesagt. Wie komm ich da jetzt ran?

Hier das Codefragment:
[JAVA=42]
URLClassLoader urlCl = new URLClassLoader(new URL[] {new URL("file:/states.jar")}, this.getClass().getClassLoader());
Class<?> mainClass = (Class<?>) urlCl.loadClass("bspState");
state = (CellState) mainClass.newInstance();
[/code]

bspState ist der name der *.class Datei in states.jar und CellState wie gesagt das Interface von dem bspState abgeleitet ist. Ich bekomme eine ClassNotFoundException und ich tippe darauf, dass entweder die URL oder der Klassenname falsch sind und wahrscheinlich sogar beides 🙂

Würd mich freuenw enn mir jemand helfen könnte

mfg
 
eine Klasse kleingeschrieben ist ja grundverdächtig für allen möglichen Ärger,
Klassen schreibt man doch groß..,
ohne package ist auch recht schlimm, alle Klassen IN packages können diese dann nicht importieren,
ob aber auch Reflection nicht funktioniert weiß ich grad nicht,

funktioniert normaler Code mit der Klasse, wenn du die Jar in den ClassPath einbindest?
wenn nichts spannendes drin ist kannst du das jar hochladen (Anhang an Posting)

> Die liegt derzeit bei mir im selben Package ichd as die schon überall hingetan aber ohne Erfolg wo muss die wirklich hin?

muss in der Konsole wahrscheinlich direkt in den ClassPath:
java -cp .;c:/.../xy.jar Programm
 
Das mit der kleingeschriebenen Klasse (bspState meinste vermutlich) ist nur nen Schriebfehler weil ichs etwas vereinfacht hab im Prinzip kommt der name bei mir aus einer xml Datei und eigentlich auch der Pfad wo die .jar liegen soll (mit dem "file:\" bin ich ja im selben ordner einfach wie die ausführende Datei liegt oder?)

Also wenn ich bspState mit nem Pfad zu ner Klasse austausche die halt noch keine .jar ist und wohl auch im Classpath des Hauptprogramms ist funktioniert das Einwandfrei. Ich teste ja noch derzeit mit Eclipse rum und die .jar liegt im selben Projektordner (um genau zu sein liegt die Datei einmal im Packageodner und einmal im Hauptverzeichnis) also sollte die ja im ClassPath drinne sein.
 
die Jar muss extra eingebunden werden,
Project-Properties, Java Build Path, External oder Libraries, Add External Jar,

ob man zur Laufzeit Jars durch dynamisches Ändern des ClassPaths reinbekommt?..
 
Das funktioniert tatsächlich wenn ich das einbinde. Das Problem ist aber noch ncith so ganz das was ich eigentlich brauche. Wenn ich das in den Classpath einfüge und die Klasse dann ja schon zur Compilerzeit dem Programm bekannt ist, dann bringt mir das ja nichts, da diese States austauschbar sein sollen undzwar im prinzip über eine url zu eienr .jar Datei die eben so einen State enthält.

[JAVA=42]URLClassLoader urlCl = new URLClassLoader(new URL[] {new URL("file:/states.jar")}, this.getClass().getClassLoader());
[/code]

Was ich da bei new URL("") reinschriebe ist irgendwie auch vollkommen egal also ich hab da nen Pfad zuwas angegeben was es nicht gibt und das funktionierte nun trotdzem den State einzuladen, da er ja im classpath war. Irgendwo muss doch der Fehler bei der Classloadergeschichte sien oder?
 
oh, richtig, mit dem ersten Parameter kann man genau das machen,
wenn es bei dir nicht klappt, was ich als Aussage deines Postings vermute, dann arbeite an der URL,

also die erstmal für sich testen, gehts mit absoluten Pfad? muss das file:/ überhaupt sein?
was liefert
new File(url.getFile().getAbsolutePath()
? usw.
kann aktuell nicht direkt sagen was zu verbessern ist, nur in die Richtung schauen
 

Neue Themen


Zurück
Oben