Wie bekomme ich einen Namen für eine Methode, die ausgeführt wird?

Wie erhalte ich den Namen einer auszuführenden Methode?

1. Überblick

Manchmal müssen wir den Namen der aktuell ausgeführten Java-Methode kennen.

In diesem kurzen Artikel werden einige einfache Methoden vorgestellt, mit denen Sie den Methodennamen im aktuellen Ausführungsstapel ermitteln können.

2. Verwenden vongetEnclosingMethod

Wir können den Namen der ausgeführten Methode mithilfe dergetEnclosingMethod()-API ermitteln:

public void givenObject_whenGetEnclosingMethod_thenFindMethod() {
    String methodName = new Object() {}
      .getClass()
      .getEnclosingMethod()
      .getName();

    assertEquals("givenObject_whenGetEnclosingMethod_thenFindMethod",
      methodName);
}

3. Verwenden vonThrowable Stack Trace

Wenn Sie einen Stack-Trace vonThrowableverwenden, erhalten Sie einen Stack-Trace mit der aktuell ausgeführten Methode:

public void givenThrowable_whenGetStacktrace_thenFindMethod() {
    StackTraceElement[] stackTrace = new Throwable().getStackTrace();

    assertEquals(
      "givenThrowable_whenGetStacktrace_thenFindMethod",
      stackTrace[0].getMethodName());
}

4. Thread Stack Trace verwenden

Außerdem enthält der Stack-Trace eines aktuellen Threads (seit JDK 1.5) normalerweise den Namen der ausgeführten Methode:

public void givenCurrentThread_whenGetStackTrace_thenFindMethod() {
    StackTraceElement[] stackTrace = Thread.currentThread()
      .getStackTrace();

    assertEquals(
      "givenCurrentThread_whenGetStackTrace_thenFindMethod",
      stackTrace[1].getMethodName());
}

Wir müssen uns jedoch daran erinnern, dass diese Lösung einen erheblichen Nachteil hat. Einige virtuelle Maschinen überspringen möglicherweise einen oder mehrere Stapelrahmen. Obwohl dies nicht üblich ist, sollten wir uns dessen bewusst sein, dass dies passieren kann.

5. Fazit

In diesem Tutorial haben wir einige Beispiele vorgestellt, wie der Name der aktuell ausgeführten Methode ermittelt werden kann. Beispiele basieren auf Stapelspuren undgetEnclosingMethod().

Wie immer können Sie die Beispiele in diesem Artikelover on GitHub lesen.