*Markus: Klassen dynamisch laden?

Hallo,

ich muss diverse Klassen dynamisch laden, wobei ich es testhalber zuerst mit einer Testklasse versucht habe. Meine Testklassen sehen so aus:

  
public class LevelTest {  
     private String teststring = "AAAA";  
     public String teststring2 = "test";  
     public int testzahl = 345;  
}  
---------------------------------------------  
import java.lang.reflect.Field;  
  
public class KlassenLoader extends ClassLoader {  
  
 public static void main(String[] args) {  
        try {  
   Class<?> testklasse = getSystemClassLoader().loadClass("LevelTest");  
   System.out.println("Klasse erfolgreich eingelesen...");  
   Field[] input = testklasse.getFields();  
      for (int i = 0; i < input.length; i++)  
       System.out.println("Index " + i + ": " + input[i]);  
      int testint = input[1].getInt(input[1].getName());  
      System.out.println("testint: " + testint);  
  } catch (SecurityException e) {  
    e.printStackTrace();  
  } catch (ClassNotFoundException e) {  
   e.printStackTrace();  
  } catch (IllegalArgumentException e) {  
   e.printStackTrace();  
  } catch (IllegalAccessException e) {  
   e.printStackTrace();  
  }  
  
    }  
}  

In diesem Fall sieht die Ausgabe so aus:

Klasse erfolgreich eingelesen...
Index 0: public java.lang.String LevelTest.teststring2
Index 1: public int LevelTest.testzahl
java.lang.IllegalArgumentException: Can not set int field LevelTest.testzahl to java.lang.String
 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
 at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
 at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
 at sun.reflect.UnsafeIntegerFieldAccessorImpl.getInt(UnsafeIntegerFieldAccessorImpl.java:38)
 at java.lang.reflect.Field.getInt(Field.java:499)
 at KlassenLoader.main(KlassenLoader.java:12)

IIch habe in der ersten Zeile der Main-Methode die Class-Deklaration mit einem Fragezeichen erstellt. Zugegebenermaßen weiß ich nicht, was ich da tue. Ich sah in der Javadoc oft ein Fragezeichen zwischen den spitzen Klammern, also wollte ich mal sehen, ob es etwas bewirkt. Es funktioniert zwar das Einlesen, aber die Exception kommt, da ich wahrscheinlich keine Instanz dieser Klasse gebildet habe. Füge ich ein "newInstance" dieser Zeile hinzu, also

Class<?> testklasse = getSystemClassLoader().loadClass("LevelTest").newInstance();

bemängelt es Eclipse gleich folgendermaßen:

Type-mismatch: Cannot convert from capture-of ? to Class<?>.
Was genau bedeutet eigentlich in der Javadoc ein Fragezeichen oder ein "T" zwischen den spitzen Klammern bei Klassenerklärungen.
Wie komme ich weiters zu den Variableninhalten der eingelesenen Klasse?

Markus

  1. Ok,hab's nun hinbekommen...

      
    import java.lang.reflect.InvocationTargetException;  
      
    public class KlassenLoader extends ClassLoader {  
      
     public static void main(String[] args) {  
      try {  
        Class klasse = Class.forName("LevelTest");  
        Object o = klasse.newInstance();  
        int testzahl2 = o.getClass().getField("testzahl").getInt(o);  
        System.out.println(testzahl2);  
    //    Methodenaufruf testen  
        System.out.println(o.getClass().getMethod("getTeststring").invoke(o));  
      } catch (ClassNotFoundException e) {  
       e.printStackTrace();  
      } catch (InstantiationException e) {  
       e.printStackTrace();  
      } catch (IllegalAccessException e) {  
       e.printStackTrace();  
      } catch (SecurityException e) {  
       e.printStackTrace();  
      } catch (NoSuchFieldException e) {  
       e.printStackTrace();  
      } catch (NoSuchMethodException e) {  
       e.printStackTrace();  
      } catch (IllegalArgumentException e) {  
       e.printStackTrace();  
      } catch (InvocationTargetException e) {  
       e.printStackTrace();  
      }  
        }  
    }  
    
    

    Markus