Hogyan lehet megnevezni a végrehajtandó módszert?

1. Áttekintés

Néha tudnunk kell a végrehajtandó Java módszer nevét.

Ez a rövid cikk néhány egyszerű módszert mutat be, amellyel megszerezheti a módszer nevét az aktuális végrehajtási veremben.

2. Java 9: ​​Stack-Walking API

A Java 9 bevezette a Stack-Walking API-t, hogy lustán és hatékonyan haladjon át a JVM veremkeretein. Annak érdekében, hogy megtaláljuk az API-val jelenleg végrehajtott módszert, írhatunk egy egyszerű tesztet:

public void givenJava9_whenWalkingTheStack_thenFindMethod () {StackWalker walker = StackWalker.getInstance (); Választható módszerNév = walker.walk (keretek -> keretek .findFirst () .map (StackWalker.StackFrame :: getMethodName)); assertTrue (metódusNév.isPresent ()); assertEquals ("adottJava9_whenWalkingTheStack_thenFindMethod", methodName.get ()); }

Először kapunk egy StackWalker például a getInstance () gyári módszer. Akkor használjuk a séta() módszer a veremkeretek fentről lefelé haladásához:

  • A séta() metódus képes átalakítani a veremkeretek folyamát - Folyambármire
  • Az adott adatfolyam első eleme a verem felső kerete
  • A verem legfelső kerete mindig az éppen végrehajtott módszert képviseli

Ezért, ha megkapjuk az első elemet a folyamból, megtudjuk az éppen végrehajtott módszer részleteit. Pontosabban, tudjuk használni StackFrame.getMethodName () hogy megtalálja a módszer nevét.

2.1. Előnyök

A Stack-Walking API más megközelítésekhez (később róluk később) képest néhány előnye van:

  • Nem kell létrehozni egy anonim névtelen belső osztálypéldányt - új objektum (). getClass () {}
  • Nem szükséges hamis kivételt létrehozni - új dobható ()
  • Nem kell lelkesen rögzíteni az egész stacktrace-et, ami költséges lehet

Épp ellenkezőleg, a StackWalker csak lustán jár egyesével a veremben. Ebben az esetben csak a legfelső keretet kapja le, szemben a stacktrace megközelítéssel, amely lelkesen rögzíti az összes keretet.

A lényeg: ha a Java 9+ rendszert futtatja, használja a Stack-Walking API-t.

3. Használata getEnclosingMethod

A végrehajtandó módszer nevét a getEnclosingMethod () API:

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

4. Használata Dobható Verem nyom

Használva Dobható verem nyomkövetés ad verem nyomkövetést a jelenleg végrehajtott módszerrel:

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

5. Menetköteg nyomkövető használata

Ezenkívül az aktuális szál veremkövetése (a JDK 1.5 óta) általában tartalmazza a végrehajtandó módszer nevét:

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

Nem szabad megfeledkeznünk arról, hogy ennek a megoldásnak egyetlen jelentős hátránya van. Egyes virtuális gépek kihagyhatnak egy vagy több veremkeretet. Bár ez nem gyakori, tisztában kell lennünk azzal, hogy ez megtörténhet.

6. Következtetés

Ebben az oktatóanyagban bemutattunk néhány példát arra, hogyan szerezzük be az éppen végrehajtott módszer nevét. A példák veremnyomokon és getEnclosingMethod ().

Mint mindig, itt is megnézheti a cikkben található példákat a GitHubon. A Java 9 példák elérhetők a Java 9 GitHub modulunkban is.


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