Hvordan får jeg navnet på en metode, der udføres?

1. Oversigt

Nogle gange er vi nødt til at kende navnet på den aktuelle Java-metode, der udføres.

Denne hurtige artikel præsenterer et par enkle måder at få fat i metodens navn i den aktuelle udførelsesstak.

2. Java 9: ​​Stack-Walking API

Java 9 introducerede Stack-Walking API for at krydse JVM-stack-rammerne på en doven og effektiv måde. For at finde den nuværende udførelsesmetode med denne API kan vi skrive en simpel test:

offentlig ugyldighed givenJava9_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 ved hjælp af getInstance () fabriksmetode. Så bruger vi gå() metode til at krydse stabelrammerne fra toppen til bunden:

  • Det gå() metode kan konvertere en strøm af stakrammer - Strømtil noget
  • Det første element i den givne strøm er den øverste ramme på stakken
  • Den øverste ramme på stakken repræsenterer altid den aktuelt udførte metode

Derfor, hvis vi får det første element fra strømmen, kender vi de detaljerede metodedetaljer. Mere specifikt, vi kan bruge StackFrame.getMethodName () for at finde metodens navn.

2.1. Fordele

Sammenlignet med andre tilgange (mere om dem senere) har Stack-Walking API et par fordele:

  • Ingen grund til at oprette en dummy anonym indre klasse instans - nyt objekt (). getClass () {}
  • Ingen grund til at oprette en dummy undtagelse - ny kastbar ()
  • Ingen grund til at ivrigt fange hele stacktrace, hvilket kan være dyrt

Tværtimod StackWalker går kun stakken en efter en på doven måde. I dette tilfælde henter det kun den øverste ramme i modsætning til stacktrace-tilgangen, der ivrigt fanger alle rammerne.

Bundlinjen er, brug Stack-Walking API, hvis du bruger Java 9+.

3. Brug getEnclosingMethod

Vi kan finde navnet på den metode, der udføres ved hjælp af getEnclosingMethod () API:

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

4. Brug Kan kastes Stakspor

Brug af en Kan kastes stack trace giver os stack trace med den metode, der aktuelt udføres:

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

5. Brug af trådspor

Staksporingen af ​​en aktuel tråd (siden JDK 1.5) inkluderer normalt også navnet på den metode, der udføres:

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

Vi skal dog huske, at denne løsning har en væsentlig ulempe. Nogle virtuelle maskiner springer muligvis over en eller flere stabelrammer. Selvom dette ikke er almindeligt, skal vi være opmærksomme på, at dette kan ske.

6. Konklusion

I denne vejledning har vi præsenteret nogle eksempler på, hvordan man får navnet på den aktuelt udførte metode. Eksempler er baseret på stakspor og getEnclosingMethod ().

Som altid kan du tjekke eksemplerne i denne artikel på GitHub. Java 9-eksempler er også tilgængelige i vores Java 9 GitHub-modul.


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