# Methode als Parameter einer Methode übergeben?



## flashray (14. Oktober 2005)

Hallo,

ich möchte beim Aufruf einer Methode ihr als Parameter eine Methode übergeben, welche sie dann ausführt.

Ist das Möglich? Wenn ja wie?
Habs mit der Wrapperklasse java.lang.Void vergeblich versucht. Funktioniert leider nicht, da man keine Objekte der Klasse Void erzeugen kann. Eine andere Alternative fällt mir jetzt nicht ein.

VG Erdal

Beispiel:


```
public class Met {

  public void a () {
    c(b());
  }

  public void b () {
    System.out.println("Test");
  }

  public void c (Methode m) {
    "Führe m aus"
  }

  public static void main (String[] args) {
    a();
  }
}
```


----------



## Thomas Darimont (14. Oktober 2005)

Hallo!

   Schau mal hier:
   (Per Reflection)

```
/**
    * 
    */
   package de.tutorials;
   
   import java.lang.reflect.Method;
   import java.lang.reflect.Modifier;
   
   /**
    * @author Tom
    * 
    */
   public class MethodInvocationExample {
   
   	/**
   	 * @param args
   	 */
   	public static void main(String[] args) throws Exception {
   
   		Foo foo = new Foo();
   		System.out.println(invokeMethod("methodA", new Class[0], new Object[0],
   				foo.getClass(), foo));
   		System.out.println(invokeMethod("methodB", new Class[] { int.class,
 		 	String.class }, new Object[] { Integer.valueOf(10), "Foo" },
   				foo.getClass(), foo));
   		System.out.println(invokeMethod("methodC",
 		 	new Class[] { String.class }, new Object[] { "Bar" }, foo
 		 			.getClass(), foo));
   
   	}
   
   	private static Object invokeMethod(String methodName, Class[] signature,
   			Object[] parameters, Class targetClass, Object target)
   			throws Exception {
   		Method m = targetClass.getDeclaredMethod(methodName, signature);
   
   		if (Modifier.isPrivate(m.getModifiers())) {
   			m.setAccessible(true);
   		}
   
   		return m.invoke(target, parameters);
   	}
   
   	static class Foo {
   		private void methodA() {
   			System.out.println("methodA");
   		}
   
   		public void methodB(int i, String s) {
   			System.out.println("methodB: " + i + " " + s);
   		}
   
   		public static int methodC(String s) {
   			System.out.println("methodC " + s);
   			return 42;
   		}
   	}
   
   }
```
   Oder per CommandPattern:
http://www.google.de/search?hl=de&q=Java+CommandPattern&btnG=Suche&meta=lr=lang_de

  (Siehe auch die Klassen java.beans.Statement, java.util.concurrent.Callable ...)

   Gruss Tom


----------



## RealHAZZARD (14. Oktober 2005)

Tach.
Das geht wunderbar, wenn der Rückgabewert der Methode m passt.
Also wenn c einen integerwert erwartet, darf m auch nur nen int-wert 
zurückgeben.


----------



## Inkarnat (20. Juli 2008)

hi,

tschuldigung, dass ich so einen alten Thread auspacke, aber ich habe eine ähnliche Problematik zu bewältigen...

 ich wollte auch per Reflection eine Methode als Parameter übergeben, doch
aus dem schönen Beispiel von Thomas Darimont oder auch aus dieser Quelle:
http://de.wikibooks.org/wiki/Java_Standard:_Class

scheint hervorzugehen, dass
Class.getDeclaredMethod(methodName, signature)  als signature nur ein seltsames Class<?>[] Object, das nur Primitives halten "verträgt".

Die Methoden, die ich aufrufen möchte, erwarten als Parameter aber Objekte - wie kann ich diese aufrufen?

gruß Inkarnat


----------



## zerix (21. Juli 2008)

Hallo,

du kannst in dem Class[] auch andere Class-Objecte mitgeben, nicht nur primitive.

MFG

Sascha


----------



## takidoso (21. Juli 2008)

Mal ne Frage...
muss die Methode denn unbedingt generisch (soll mheißen: beleibig) sein?
Ich verwende für sowas normalerweise Interfaces.


----------

