777 Stimmen

Wie rufe ich eine Java-Methode auf, wenn der Name der Methode als String angegeben ist?

Wenn ich zwei Variablen habe:

Object obj;
String methodName = "getName";

Ohne Kenntnis der Klasse der obj wie kann ich die Methode aufrufen, die durch methodName darauf?

Die aufgerufene Methode hat keine Parameter, und ein String Rückgabewert. Es ist ein Getter für eine Java-Bohne .

1voto

FriskySaga Punkte 389

Angenommen, Sie rufen eine statische Methode von einer statischen Methode innerhalb derselben Klasse auf. Dazu können Sie den folgenden Code verwenden.

class MainClass
{
  public static int foo()
  {
    return 123;
  }

  public static void main(String[] args)
  {
    Method method = MainClass.class.getMethod("foo");
    int result = (int) method.invoke(null); // answer evaluates to 123
  }
}

Zur Erklärung: Da wir hier keine echte objektorientierte Programmierung durchführen und somit die Erstellung unnötiger Objekte vermeiden wollen, werden wir stattdessen die class Eigenschaft zum Aufrufen von getMethod() .

Dann werden wir in null für die invoke() Methode, weil wir kein Objekt haben, mit dem wir diesen Vorgang durchführen können.

Und schließlich, weil wir, die Programmierer, wissen, dass wir eine Ganzzahl erwarten, dann wir explizit den Rückgabewert der invoke() Aufruf in eine Ganzzahl umzuwandeln.

Jetzt werden Sie sich vielleicht fragen: "Was ist überhaupt der Sinn dieser ganzen nicht objektorientierten Programmierung in Java?"

Mein Anwendungsfall war die Lösung von Projekt-Euler-Problemen in Java. Ich habe eine einzige Java-Quelldatei, die alle Lösungen enthält, und ich wollte Befehlszeilenargumente übergeben, um zu bestimmen, welches Project Euler-Problem ausgeführt werden soll.

1voto

Gautam Punkte 3511

Bei mir funktioniert das einwandfrei:

public class MethodInvokerClass {
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, ClassNotFoundException, InvocationTargetException, InstantiationException {
        Class c = Class.forName(MethodInvokerClass.class.getName());
        Object o = c.newInstance();
        Class[] paramTypes = new Class[1];
        paramTypes[0]=String.class;
        String methodName = "countWord";
         Method m = c.getDeclaredMethod(methodName, paramTypes);
         m.invoke(o, "testparam");
}
public void countWord(String input){
    System.out.println("My input "+input);
}

}

Sortie :

My input testparam

Ich kann die Methode aufrufen, indem ich ihren Namen an eine andere Methode (wie main) übergebe.

-9voto

SMayne Punkte 15

Für mich eine ziemlich einfache und narrensichere Art und Weise wäre, einfach eine Methode Aufrufer Methode wie so zu machen:

public static object methodCaller(String methodName)
{
    if(methodName.equals("getName"))
        return className.getName();
}

Wenn Sie die Methode dann aufrufen müssen, geben Sie einfach etwas wie Folgendes ein

//calling a toString method is unnessary here, but i use it to have my programs to both rigid and self-explanitory 
System.out.println(methodCaller(methodName).toString());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X