Hallo Leute,
ich muss eine Jar-Datei dynamisch einlesen und über Reflection ansprechen. Wir arbeiten mit einem Framework, das in mehreren Versionen vorhanden ist. Das Programm, welches die Jar-Datei nachlädt hat die neueste Version des Framework eingebaut. In der nachgeladenen Jar-Datei ist irgendeine Version des Framework vorhanden, deren Versionsnummer ich auch auslesen kann.
Das Problem ist jetzt, dass die Ziel-Klasse von einer Basisklasse abgeleitet wird, die in allen Versionen des Framework vorhanden ist, aber in der neuesten Version ein geändertes Interface besitzt, konkret fehlt im neuen Framework eine Methode, die im alten notwendig ist.
Beim Versuch jetzt über Reflection auf diese Methode zuzugreifen scheint Reflection immer anzunehmen, dass die neue Version der Basisklasse zugrunde liegt, und findet die erforderliche Methode in der instanziierten Klasse nicht...
z.B.
ohje, ich hoffe das ist verständlich. vielleicht noch mal zusammengefasst. Ich lade ein Jar nach, instanziiere eine Klasse über Reflection, und bekomme dann aber nicht die gewünschte Methode, weil (so denke ich) die zugrundeliegende Basisklasse mit einem unterschiedlichen Interface im Programm schon vorhanden ist.
In nem Test, mit einfachem Zugrif über Reflection bekomme ich die Methode, nur im eigentlichen Programm nicht.
Noch was zum eigentlichen Code. Leider darf ich keine original Code Fragmente einstellen (daher auch das Beispiel oben). Ich hoffe jemand kann sich eine Lösung für das Problem vorstellen. Am Framework selber darf nichts verändert werden.
Danke schon mal für eure Tips
Stefan
ich muss eine Jar-Datei dynamisch einlesen und über Reflection ansprechen. Wir arbeiten mit einem Framework, das in mehreren Versionen vorhanden ist. Das Programm, welches die Jar-Datei nachlädt hat die neueste Version des Framework eingebaut. In der nachgeladenen Jar-Datei ist irgendeine Version des Framework vorhanden, deren Versionsnummer ich auch auslesen kann.
Das Problem ist jetzt, dass die Ziel-Klasse von einer Basisklasse abgeleitet wird, die in allen Versionen des Framework vorhanden ist, aber in der neuesten Version ein geändertes Interface besitzt, konkret fehlt im neuen Framework eine Methode, die im alten notwendig ist.
Beim Versuch jetzt über Reflection auf diese Methode zuzugreifen scheint Reflection immer anzunehmen, dass die neue Version der Basisklasse zugrunde liegt, und findet die erforderliche Methode in der instanziierten Klasse nicht...
z.B.
Code:
Framwork V1 :
package de.gui;
class BasisKlasse {
.
.
public final void dieMethode () {
}
}
Framework V2:
package de.gui;
class BasisKlasse {
.
.
.
public final void irgendeineMethode () {
}
}
jetzt die Implementierung der Jardatei (mit Framework V1):
package de.gui;
public class tolleJarDatei extends BasisKlasse {
public tolleJarDatei () {}
.
.
public static void main (String[] args) {
}
}
und das Analyseprogramm (mit Framework V2):
package de.gui;
public class irgendEineKlasse extends BasisKlasse {
public irgendEineKlasse () {}
.
.
}
----
package de.analysator
import de.gui.irgendEineKlasse;
public class Analysator {
public static void analysiere (File jarFile) {
RL[] U = new URL[1];
U[0] = jarFile.toURL ();
URLClassLoader URLC = new URLClassLoader (U, ClassLoader.getSystemClassLoader ());
JarFile jf = new JarFile (jarFile);
Manifest manifest = jf.getManifest ();
String className = manifest.getMainAttributes ().getValue ("Main-Class");
Object inst = URLC.loadClass (className).newInstance ();
Method met = inst.getClass ().getMethod ("dieMethode", new Class[] {});
// hier gibts jetzt eine NoSuchMethodException
.
.
}
}
ohje, ich hoffe das ist verständlich. vielleicht noch mal zusammengefasst. Ich lade ein Jar nach, instanziiere eine Klasse über Reflection, und bekomme dann aber nicht die gewünschte Methode, weil (so denke ich) die zugrundeliegende Basisklasse mit einem unterschiedlichen Interface im Programm schon vorhanden ist.
In nem Test, mit einfachem Zugrif über Reflection bekomme ich die Methode, nur im eigentlichen Programm nicht.
Noch was zum eigentlichen Code. Leider darf ich keine original Code Fragmente einstellen (daher auch das Beispiel oben). Ich hoffe jemand kann sich eine Lösung für das Problem vorstellen. Am Framework selber darf nichts verändert werden.
Danke schon mal für eure Tips
Stefan