Ako získať názov metódy, ktorá sa má vykonať?

1. Prehľad

Niekedy potrebujeme poznať názov aktuálnej vykonávanej metódy Java.

Tento rýchly článok predstavuje niekoľko jednoduchých spôsobov, ako získať názov metódy v aktuálnom zásobníku vykonania.

2. Java 9: ​​Stack-Walking API

Java 9 predstavila rozhranie Stack-Walking API na lenivé a efektívne prechádzanie rámcov zásobníka JVM. Aby sme pomocou tohto API našli aktuálne vykonávanú metódu, môžeme napísať jednoduchý test:

public void givenJava9_whenWalkingTheStack_thenFindMethod () {StackWalker walker = StackWalker.getInstance (); Voliteľný methodName = walker.walk (rámy -> rámce .findFirst () .map (StackWalker.StackFrame :: getMethodName)); assertTrue (methodName.isPresent ()); assertEquals ("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get ()); }

Najskôr dostaneme a StackWalker napríklad pomocou getInstance () továrenská metóda. Potom použijeme chodiť () spôsob prechádzania rámcov stohu zhora nadol:

  • The chodiť () metóda môže previesť prúd rámcov zásobníka - Prúdna čokoľvek
  • Prvým prvkom v danom streame je horný rámec v zásobníku
  • Horný rám v zásobníku vždy predstavuje práve vykonávanú metódu

Ak teda dostaneme prvý prvok zo streamu, poznáme podrobnosti práve prebiehajúcej metódy. Konkrétnejšie, môžeme použiť StackFrame.getMethodName () nájsť názov metódy.

2.1. Výhody

V porovnaní s inými prístupmi (viac o nich neskôr) má rozhranie Stack-Walking API niekoľko výhod:

  • Nie je potrebné vytvárať atrapy anonymných inštancií vnútornej triedy - new Object (). getClass () {}
  • Nie je potrebné vytvárať atrapy výnimiek - nový hoditeľný ()
  • Nie je potrebné dychtivo zachytiť celý stacktrace, čo môže byť nákladné

Naopak, StackWalker chodí stoh len po jednom lenivým spôsobom. V tomto prípade načíta iba horný rám, na rozdiel od prístupu stacktrace, ktorý dychtivo zachytáva všetky rámce.

Záverom je, že ak máte Java 9+, použite rozhranie Stack-Walking API.

3. Používanie getEnclosingMethod

Názov metódy, ktorá sa vykonáva, nájdeme pomocou getEnclosingMethod () API:

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

4. Používanie Hoditeľné Stohová stopa

Pomocou a Hoditeľné Stopa trasovanie nám dáva stopu stohu pomocou metódy, ktorá sa práve vykonáva:

public void givenThrowable_whenGetStacktrace_thenFindMethod () {StackTraceElement [] stackTrace = nový Throwable (). getStackTrace (); assertEquals ("givenThrowable_whenGetStacktrace_thenFindMethod", stackTrace [0] .getMethodName ()); }

5. Používanie sledovania zásobníka nití

Trasovanie zásobníka aktuálneho vlákna (od JDK 1.5) tiež zvyčajne obsahuje názov vykonávanej metódy:

public void givenCurrentThread_whenGetStackTrace_thenFindMethod () {StackTraceElement [] stackTrace = Thread.currentThread () .getStackTrace (); assertEquals ("givenCurrentThread_whenGetStackTrace_thenFindMethod", stackTrace [1] .getMethodName ()); }

Musíme si však uvedomiť, že toto riešenie má jednu významnú nevýhodu. Niektoré virtuálne stroje môžu preskočiť jeden alebo viac rámcov zásobníka. Aj keď to nie je bežné, mali by sme si uvedomiť, že sa to môže stať.

6. Záver

V tomto tutoriáli sme predstavili niekoľko príkladov, ako získať názov aktuálne vykonávanej metódy. Príklady sú založené na trasovaní zásobníka a getEnclosingMethod ().

Ako vždy, môžete si pozrieť príklady uvedené v tomto článku na stránkach GitHub. Príklady Java 9 sú k dispozícii aj v našom module Java 9 GitHub.


$config[zx-auto] not found$config[zx-overlay] not found