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 hab

    public 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.


Anmelden zum Antworten