544 Stimmen

Abfrage des Namens der aktuell ausgeführten Methode

Gibt es eine Möglichkeit, den Namen der gerade ausgeführten Methode in Java zu erfahren?

47voto

alexsmail Punkte 5471
 public class SomeClass {
   public void foo(){
      class Local {};
      String name = Local.class.getEnclosingMethod().getName();
   }
 }

name wird den Wert foo haben.

47voto

Radiodef Punkte 36216

Dies kann geschehen durch StackWalker seit Java 9.

public static String getCurrentMethodName() {
    return StackWalker.getInstance()
                      .walk(s -> s.skip(1).findFirst())
                      .get()
                      .getMethodName();
}

public static String getCallerMethodName() {
    return StackWalker.getInstance()
                      .walk(s -> s.skip(2).findFirst())
                      .get()
                      .getMethodName();
}

StackWalker ist auf Faulheit ausgelegt und daher wahrscheinlich effizienter als z.B., Thread.getStackTrace die eifrig ein Array für den gesamten Aufrufstapel erstellt. Weitere Informationen finden Sie auch in der GEP.

35voto

Der schnellste Weg Das habe ich herausgefunden:

import java.lang.reflect.Method;

public class TraceHelper {
    // save it static to have it available on every call
    private static Method m;

    static {
        try {
            m = Throwable.class.getDeclaredMethod("getStackTraceElement",
                    int.class);
            m.setAccessible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getMethodName(final int depth) {
        try {
            StackTraceElement element = (StackTraceElement) m.invoke(
                    new Throwable(), depth + 1);
            return element.getMethodName();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

Es greift direkt auf die native Methode getStackTraceElement(int depth) zu. Und speichert die zugängliche Methode in einer statischen Variablen.

24voto

Sumit Singh Punkte 24033

Verwenden Sie den folgenden Code:

    StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
    StackTraceElement e = stacktrace[1];//coz 0th will be getStackTrace so 1st
    String methodName = e.getMethodName();
    System.out.println(methodName);

20voto

Jay Punkte 661
public static String getCurrentMethodName() {
        return Thread.currentThread().getStackTrace()[2].getClassName() + "." + Thread.currentThread().getStackTrace()[2].getMethodName();
    }

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