# Methodenaufruf per String?



## Samson_Miller (11. Jul 2008)

Ich habe eine .jsp Seite auf der zwei Select Boxen definiert werden.


```
<select name="prefix" >
	<option value="get">get</option>
	<option value="set">set</option>
</select>

<select name="suffix" >
	<option value="Error">Error</option>
	<option value="Message">Message</option>
</select>
```

Auf der Seite des Servers möchte ich nun in Abhängigkeit von der Auswahl des Benutzers die jeweilige Methode aufrufen. Der Methodenname setzt sich aus den ausgewählten Einträgen beider Selectboxen zusammen, also "getError", "getMessage", "setError" oder "setMessage".

Wie kann ich jetzt die richtige Methode aufrufen? Bisher habe ich das mit einem if else Konstrukt gemacht:


```
if(prefix.equals("get")) {
	 if(suffix.equals("Error")){
		 getError();
	 } else if(suffix.equals("Message")){
                 getMessage();
	 } 
} else if(prefix.equals("set")) {
	 if(suffix.equals("Error")){
		setError();
	 } else if(suffix.equals("Message")){
		setMessage();
	 } 
}
```

Gibt es da vielleicht eine einfachere Möglichkeit? Vielleicht die Methode über die Konkatenation der beiden Strings aufrufen, also:


```
prefix+suffix+"();"
```

geht das überhaupt?


----------



## SlaterB (11. Jul 2008)

mit Reflection geht das, aber schön ist das ganz gewiss nicht,

mal sehen ob dir jemand einen Befehl wie "System"+"."+"exit()" reinhackt oder schlimmeres


----------



## quippy (11. Jul 2008)

Reflection ist durchaus was feines - aber auch schwehr zu beherrschen und hat auch andere Nachteile (z.B. wenn man Crossreferenzlisten erstellen muss)

Die "System.exit()" Attacke geht hier jetzt nicht, da nur die Nachricht, nicht aber das Objekt, an welche sie gesendet werden soll, mitgegeben wird.


----------



## SlaterB (11. Jul 2008)

> da nur die Nachricht, nicht aber das Objekt, an welche sie gesendet werden soll, mitgegeben wird

kommt noch, kommt noch


----------



## foobar (11. Jul 2008)

Bei 4 Möglichkeiten tut es doch auch eine einfache Map<String, MyAction> wobei MyAction ein simples Interface ist, um die enstprechende Geschäftslogikmethode aufzurufen.


```
public interface MyAction
{
   public void invoke();
}

...
Map<String, MyAction> actions = new HashMap<String, MyAction>();
actions.put("getMessage", new MyAction{public void invoke(){// dosomethting }});
usw.
...
```

Aufrufen dann mit:


```
actions.get(prefix+suffix).invoke();
```


----------

