# Dynamischer Klassenaufruf ->Class.forName().newInstance()



## raphk (11. Jan 2006)

Hallo

Ich habe ein Problem bei einem Programm das einen dynamischen Klassenaufruf erzeugen soll. Im Endeffekt gehts darum eine XML Datei auszulesen. Dann bestimmt man via DropDown Liste im Programm welche Klasse die XML bearbeitet und diese führt dann je nach Klasse bestimmte Funktionen mit den XML Tags aus.

Also ganz banal gesagt:

```
if(vendor.equals("reservation_simple"))
        {
            commandesXML rs = new reservation_simple(aa);
            
            return rs;
        }
        else if(vendor.equals("reservation_advance"))
        {
            commandesXML rs = new reservation_advance(aa);
            
            return rs;
        }
```
... wobei vendor die Klasse ist, die aufgerufen wird und commandesXML die Überklasse. So wies hier steht funktionniert das Programm auch wunderbar.

Jetzt will ich aber das ganze dynamisch machen sprich anstatt mit den if(vendor == X) else .... nur noch eine Funktione die sich via Class.forName() ihre Klasse selber sucht und diese dann aufruft. Also quasi so in etwa:

```
Class clazz = Class.forName(vendor);
Object o = clazz.newInstance();
```
Problem ist nur das das bei mir immer zu nem Error führt. Ausserdem besitzen die Klassen in ihrem Konstruktor eine Variable die man mitgibt. Und ein newINstance(VARIABLE) funktionniert auch nicht. Problem ist das er mir sagt das er beim Class.forName(X) die Klasse X nicht findet obsschon diese da ist und auch alles korrekt geschrieben ist.


Ich hab auch noch ein Problem wenn ich versuche den Konstruktor der Klasse zu bekommen den ich brauche um ein neues Objekt zu initieiren.


```
Object o = cl.getConstructor(Integer.TYPE, Integer.TYPE).newInstance(1,2);
```
So klappt das für Integer. Aber wie schreib ich das denn wenn ich ein Klassenobjekt mitgeb. Also mein Konstruktor sieht folgendermaßen aus:

```
public reservation_simple(RESERVATION res) 
    {
        objRes = res;
    }
```
Und wenn ich einfach getConstructor(RESERVATION).newInstance(res) oder auch getConstructor(Package.RESERVATION) mach kommt ein Fehler und anders wüsst ich nicht was ich da reinschreiben sollte.



Naja ich hoffe mal ihr habt plus minus verstanden worum es mir geht und noch mehr hoffe ich das mir einer weiter helfen kann!


----------



## meez (11. Jan 2006)

Immer daran denken, dass die Klassennamen "absolut" geschrieben werden müssen (z.B. net.meez.ABC)

Hier ein Beispiel:


```
package net.meez;

import ...

public class ABC {

	public ABC(List list, URL url) {}

	public static void main(String[] args) throws Exception {
		List list = new ArrayList();
		URL url = new URL("http://www.google.de");
		Class cls = Class.forName("net.meez.ABC");
		Constructor constructor = cls.getConstructor(new Class[]{List.class, URL.class});
		Object object = constructor.newInstance(new Object[]{list, url});
		ABC abc = (ABC) object;
	}
}
```


----------



## raphk (12. Jan 2006)

Stimmt ... dank dir. Mein großes Problem liegt nur an folgenden Linien:


```
Constructor constructor = cls.getConstructor(new Class[]{List.class, URL.class});
      Object object = constructor.newInstance(new Object[]{list, url}); [code]
Wie bekomme ich die newInstance() hin, wenn mein Konstruktor den ich aufrufen will ein Klassenobjekt als Parameter besitzt? Also quasi sowas:

[code] public reservation_simple(RESERVATION res) 
{
  objRes = res;
}
```

Wenn ich zB einen Konstruktor hab, der 2 Int als Parameter hätte würd ichs ja folgendermaßen anstellen;


```
Object o = cl.getConstructor(Integer.TYPE, Integer.TYPE).newInstance(1,2);
```

Ich bräuchte ja dann sowas wie


```
Object o = cl.getConstructor(RESERVATION.???).newInstance(res);
```

was allerdings net geht. Und genau da steh ich dann aufm Schlauch.


----------



## raphk (12. Jan 2006)

Ok hat sich erledigt!


----------

