# Dynamisches Einbinden von Klassen



## Streen (2. Jul 2007)

Hallo,

Als erstes versuche ich das Problem etwas zu schildern das ich habe:
Ich habe ein XML File in dem der Programmablauf konfiguriert werden soll, das in etwa so aussieht:

```
<Flow name="testflow">
		<Command name="Modul1" active="yes" option1="X"/>
		<Command name="Modul2" active="yes" option1="Y"/>
		<Command name="Modul3" active="yes" option1="Z"/>
		<Command name="Modul3" active="yes" option1="ZZ"/>
		<Command name="Modul4" active="yes" option1="A"/>
</Flow>
```

Im Programm soll dann halt nacheinander das Modul1, 2, dann zweimal das 3er und zum schluss das 4er ausgeführt werden.

Soweit ja absolut kein Problem. Das ding wird geparsed und dann in einem switch-Block werden die entsprechenden Klassen aufgerufen.

Die Idee die jetzt mein Cheffe und ich hatten, war, dass wir es gleich so machen: ModulName = Klassenname
Sprich wenn ein neues Modul hinzukommt, dass man nicht irgendwo in dem Switchblock herumfurwerken muss, sondern einfach das File in den entsprechenden Ordner für die Module packt und im XML File das dann einfach über den Namen aufrufen kann. Die einzelnen Module sind alle von einem Interfache abgeleitet, also hier sollte sichergestellt sein, dass die entsprechenden Funktionen/Datenelemente vorhanden sind. Sprich im Code müsste dann irgendwie etwas in der Art von: "parsedModuleName".execute(); stehen. 

Jetzt wollte ich fragen, ob das überhaupt möglich ist, und wenn ja wie oder unter welchem Schlagwort ich da weitere Infos bekommen kann.

Vielen Dank schon mal im Vorraus,
Wenn ich irgendwas unklar ausgedrückt hab, steinigt mich oder fragt.   

Streen

Ps.: Bin mir nicht 100%ig sicher ob das hier im richtigen Forum ist... *grübel*


----------



## Beni (2. Jul 2007)

Das was du da machen willst, ist möglich und sollte auch keine allzugrossen Probleme ergeben.

Stichwort "Reflection", insbesondere die Klasse "Class" und die Methode "Class#forName" solltest du dir mal angucken.

Mit einem "URLClassLoader" kann man sogar während das Programm schon läuft neue Klassen in das Programm laden.


----------



## Murray (2. Jul 2007)

Wenn du ohnehin für die Module ein gemeinsames Interface definierst, dann kommst du wohl auch ohne Reflection aus (es sei denn, man sieht Class#forName bereits als Reflection an).


----------



## Streen (3. Jul 2007)

Super danke für die Stichworte, da findet man gut was. 

Hier kurz meine Lösung falls jemand mal hier im Forum suchen sollte:


```
try {
	Class cls_Test = Class.forName("otherpackageName." + cls_currentCommand.getM_str_Module());
	Workflow test = (Workflow) cls_Test.newInstance(); //Workflow ist das Interface das alle Module gemeinsam haben
	test.execute();
} catch (ClassNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (InstantiationException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
} catch (IllegalAccessException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}
```


----------

