4.16.2 | Aufruf von Methoden |
Der Aufruf von Methoden erfolgt im Prinzip analog zu Konstruktoren. Die zugehörige Reflection-Klasse Method verfügt über eine Methode invoke(), mit der ein Aufruf abgesetzt werden kann. Auch für Methodenaufrufe werden die Parameterwerte auf die zuvor beschriebene Weise als Object-Array übergeben. Zusätzlich muss bei Methoden aber noch eine Referenz auf das Exemplar angegeben werden, auf dem die Methode ausgeführt werden soll. Bei statischen Methoden kann hier null übergeben werden, da diese nicht im Kontext eines bestimmten Exemplars ausgeführt werden.
Nach erfolgreicher Ausführung der Methode liefert invoke() das Ergebnis der Methode zurück. Bei Methoden, die einen einfachen Datentyp als Ergebnistyp haben (z. B. int oder boolean) wird ein Exemplar der entsprechenden Wrapper-Klasse zurückgegeben. Für Methoden mit Ergebnistyp void wird ein Exemplar von Void zurückgeliefert.
Das folgende Beispiel zeigt eine generische Methode zum Setzen von Datenelementen. Diese Methode setzt lediglich das im einleitenden Abschnitt beschriebene Muster für Bean-Properties voraus, d. h., zu einem Datenelement muss es eine get()- und eine set()-Methode geben. Die hier gezeigte Klasse DemoBean genügt dieser Konvention:public class DemoBean { int state; public int getState() { return state; } public void setState(int state) { this.state = state; } }Derartige Properties können mit der nachfolgend gezeigten Methode gesetzt werden. Ihr müssen drei Parameter übergeben werden: Der Name der Property, der Wert, der zugewiesen werden soll und schließlich das Objekt, bei dem die Property gesetzt werden soll.public static void setProperty(String name, Object val, Object instance) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Method getMethod, setMethod; Class beanClass, propertyType; // Class-Object ermitteln beanClass = instance.getClass(); // Das Method-Objekt für die get()-Methode abrufen... getMethod = beanClass.getMethod("get"+name, null); // ...um dann den Typ der Property ermitteln propertyType = getMethod.getReturnType(); // Anhand des Typs und des Namens die set-Methode ermitteln... setMethod = beanClass.getMethod("set"+name, new Class[] {propertyType}); // ... und den Aufruf absetzen setMethod.invoke(instance, new Object[] {val}); }Die folgenden Anweisungen zeigen schließlich, wie die generische setProperty()-Methode auf die zuvor gezeigte Bean-Klasse angewendet wird:DemoBean bean = new DemoBean(); PropVal.setProperty("State", new Integer(100), bean);Material zum Beispiel
- Quelltexte: