Wie erhalte ich einen Namen für eine ausgeführte Methode?

1. Übersicht

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

In diesem kurzen Artikel werden einige einfache Möglichkeiten vorgestellt, wie Sie den Methodennamen im aktuellen Ausführungsstapel abrufen können.

2. Java 9: ​​Stack-Walking-API

Java 9 führte die Stack-Walking-API ein, um die JVM-Stack-Frames faul und effizient zu durchlaufen. Um die aktuell ausgeführte Methode mit dieser API zu finden, können wir einen einfachen Test schreiben:

public void givenJava9_whenWalkingTheStack_thenFindMethod() { StackWalker walker = StackWalker.getInstance(); Optional methodName = walker.walk(frames -> frames .findFirst() .map(StackWalker.StackFrame::getMethodName)); assertTrue(methodName.isPresent()); assertEquals("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get()); }

Zuerst erhalten wir eine StackWalker- Instanz mit der Factory-Methode getInstance () . Dann verwenden wir die walk () -Methode, um die Stapelrahmen von oben nach unten zu durchlaufen:

  • Die walk () -Methode kann einen Stream von Stapelrahmen konvertieren - Stream - - zu irgendetwas
  • Das erste Element im angegebenen Stream ist der oberste Frame auf dem Stapel
  • Der oberste Frame auf dem Stapel repräsentiert immer die aktuell ausgeführte Methode

Wenn wir also das erste Element aus dem Stream erhalten, kennen wir die aktuell ausgeführten Methodendetails. Genauer gesagt, können wir verwenden StackFrame.getMethodName () den Namen der Methode zu finden.

2.1. Vorteile

Im Vergleich zu anderen Ansätzen (dazu später mehr) bietet die Stack-Walking-API einige Vorteile:

  • Es ist nicht erforderlich, eine anonyme Dummy-Instanz der inneren Klasse zu erstellen - new Object (). GetClass () {}
  • Keine Notwendigkeit, eine Dummy-Ausnahme zu erstellen - new Throwable ()
  • Es ist nicht erforderlich, die gesamte Stapelverfolgung eifrig zu erfassen, was kostspielig sein kann

Im Gegenteil, der StackWalker läuft nur faul nacheinander über den Stapel. In diesem Fall wird nur der obere Frame abgerufen, im Gegensatz zum Stacktrace-Ansatz, bei dem alle Frames eifrig erfasst werden.

Unter dem Strich sollten Sie die Stack-Walking-API verwenden, wenn Sie Java 9+ verwenden.

3. Verwenden von getEnclosingMethod

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

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

4. Verwenden von Throwable Stack Trace

Wenn Sie einen Throwable- Stack-Trace verwenden, 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()); }

5. Thread Stack Trace verwenden

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

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 wesentlichen Nachteil hat. Einige virtuelle Maschinen überspringen möglicherweise einen oder mehrere Stapelrahmen. Obwohl dies nicht üblich ist, sollten wir uns bewusst sein, dass dies passieren kann.

6. Fazit

In diesem Tutorial haben wir einige Beispiele vorgestellt, wie Sie den Namen der aktuell ausgeführten Methode erhalten. Beispiele basieren auf Stack-Traces und der Methode getEnclosingMethod () .

Wie immer können Sie die Beispiele in diesem Artikel auf GitHub nachlesen. Java 9-Beispiele finden Sie auch in unserem Java 9 GitHub-Modul.