Klasse dynamisch laden
-
Hi,
ich hab ein Problem eine Klasse mit einem parametrisierten Konstruktor zur Laufzeit zu laden.
Was ich bisher auf die Beine gestellt habpublic static Object loadWithParam(String class_name) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { Class[] argtypes = {Object[].class}; Class myClass = new SpecializedClassLoader().load_class(class_name); Constructor cons = myClass.getConstructor(argtypes); // invoke constructor with supplied arguments Object[] args = { new String("foo")}; Object myObj = cons.newInstance(args); return myObj; }
SpezialicedClassLoader ist eine Klasse, die von ClassLoader abgeleitet ist und fürs Laden verantwortlich ist.
Mit Hilfe obiger Methode sollte es mir doch möglich sein, eine Klasse wie
public class Foo { public Foo(String arg) {} }
zu laden und ihren Konstruktor mit einem String-Parameter aufzurufen?!
Dem ist jedoch nicht so. Ich bekomm zwar keine Laufzeitfehler, aber er ladet(in meinem Fall eine von JPanel abgeleitet Klasse) nicht.Kann mir jemand weiterhelfen?
-
Weiß net ob es dir Hilft, aber ich würde das so machen:
MyClass v = (MyClass)Class.forName("Klassenname").newInstance();
Die Klasse muss natürlich kompatibel zu MyClass sein - das würde ich einfach mit einem Interface realisieren - funzt bei mir ohne Probleme
> Constructor cons = myClass.getConstructor(argtypes);
> ...
> Object myObj = cons.newInstance(args);keine Ahnung was diese Zeilen Code machen - vielleicht ist das äquivalent zu meinem Code - kenn mich da zu wenig mit Java aus
-
Wieso definierst du argtypes mit Object[].class wenn du doch nur einen String übergibst?
So würde es laufen:
import java.lang.reflect.*; public class ReflectionTester { public static Object loadWithParam(String class_name) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { Class[] argtypes = {String.class}; Class myClass = Class.forName(class_name); Constructor cons = myClass.getConstructor(argtypes); // invoke constructor with supplied arguments Object[] args = { new String("foo given")}; Object myObj = cons.newInstance(args); return myObj; } public static void main (String args[]) { Object o = null; try { o = loadWithParam("Foo"); } catch (ClassNotFoundException cnfex) { cnfex.printStackTrace(); } catch (IllegalAccessException iaex) { iaex.printStackTrace(); } catch (InstantiationException iex) { iex.printStackTrace(); } catch (InvocationTargetException itex) { itex.printStackTrace(); } catch (NoSuchMethodException nsmex) { nsmex.printStackTrace(); } System.out.println(o.toString()); } }
mit zugehöriger Foo.java
public class Foo { String str = null; public Foo(String arg) { this.str = arg; } public String toString() { return str; } }
-
Wieso definierst du argtypes mit Object[].class wenn du doch nur einen String übergibst?
Weil ich es mit String probiert habe und es nicht lief(oder ich es mir zumindest eingebildet hab).
Danke jedenfalls! Es funktioniert jetzt.