Hvordan få et navn på en metode som utføres?

1. Oversikt

Noen ganger trenger vi å vite navnet på den gjeldende Java-metoden som utføres.

Denne raske artikkelen presenterer et par enkle måter å få tak i metodens navn i den nåværende utførelsesstakken.

2. Java 9: ​​Stack-Walking API

Java 9 introduserte Stack-Walking API for å krysse JVM-stack-rammene på en lat og effektiv måte. For å finne den kjørende metoden med dette API-et, kan vi skrive en enkel test:

offentlig tomrom gittJava9_whenWalkingTheStack_thenFindMethod () {StackWalker walker = StackWalker.getInstance (); Valgfri methodName = walker.walk (frames -> frames .findFirst () .map (StackWalker.StackFrame :: getMethodName)); assertTrue (methodName.isPresent ()); assertEquals ("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get ()); }

Først får vi en StackWalker eksempel bruker getInstance () fabrikkmetode. Så bruker vi gå() metode for å krysse stabelrammer fra topp til bunn:

  • De gå() metoden kan konvertere en strøm med stabelrammer - Strømtil hva som helst
  • Det første elementet i den gitte strømmen er topprammen på bunken
  • Den øverste rammen på stakken representerer alltid den nåværende utførelsesmetoden

Derfor, hvis vi får det første elementet fra strømmen, vil vi kjenne de nåværende metodedetaljene. Mer spesifikt, Vi kan bruke StackFrame.getMethodName () for å finne metodens navn.

2.1. Fordeler

Sammenlignet med andre tilnærminger (mer om dem senere), har Stack-Walking API noen fordeler:

  • Ingen grunn til å lage en dummy anonym indre klasse forekomst - nytt objekt (). getClass () {}
  • Ingen grunn til å lage et dummy unntak - ny kastbar ()
  • Ingen grunn til å ivrig fange hele stacktrace, noe som kan være kostbart

Tvert imot, den StackWalker bare går stabelen en etter en på lat måte. I dette tilfellet henter den bare topprammen, i motsetning til stacktrace-tilnærmingen som fanger alle rammene ivrig.

Poenget er å bruke Stack-Walking API hvis du bruker Java 9+.

3. Bruke getEnclosingMethod

Vi kan finne navnet på metoden som utføres ved å bruke getEnclosingMethod () API:

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

4. Bruke Kastbar Stack Trace

Bruker en Kastbar stack trace gir oss stack trace med metoden som utføres for øyeblikket:

offentlig ugyldig givenThrowable_whenGetStacktrace_thenFindMethod () {StackTraceElement [] stackTrace = new Throwable (). getStackTrace (); assertEquals ("givenThrowable_whenGetStacktrace_thenFindMethod", stackTrace [0] .getMethodName ()); }

5. Bruke trådspor

Også stabelsporet til en gjeldende tråd (siden JDK 1.5) inkluderer vanligvis navnet på metoden som utføres:

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

Vi må imidlertid huske at denne løsningen har en betydelig ulempe. Noen virtuelle maskiner kan hoppe over en eller flere stabelrammer. Selv om dette ikke er vanlig, bør vi være klar over at dette kan skje.

6. Konklusjon

I denne veiledningen har vi presentert noen eksempler på hvordan du får navnet til den nåværende utførte metoden. Eksempler er basert på stablespor og getEnclosingMethod ().

Som alltid kan du sjekke eksemplene i denne artikkelen på GitHub. Java 9-eksempler er også tilgjengelige i Java 9 GitHub-modulen.


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