Kako doći do naziva metode koja se izvršava?

1. Pregled

Ponekad moramo znati naziv trenutne Java metode koja se izvršava.

Ovaj kratki članak predstavlja nekoliko jednostavnih načina kako doći do naziva metode u trenutnom snopu izvršavanja.

2. Java 9: ​​API za hodanje po stogu

Java 9 predstavila je API za hodanje po steku da bi lijeno i učinkovito prelazio JVM okvire stoga. Kako bismo pronašli trenutno izvršnu metodu s ovim API-jem, možemo napisati jednostavan test:

javna praznina givenJava9_whenWalkingTheStack_thenFindMethod () {StackWalker walker = StackWalker.getInstance (); Neobvezna metodaName = walker.walk (okviri -> okviri .findFirst () .map (StackWalker.StackFrame :: getMethodName)); assertTrue (methodName.isPresent ()); assertEquals ("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get ()); }

Prvo, dobivamo a StackWalker primjer pomoću getInstance () tvornička metoda. Tada koristimo hodati() metoda prelaska okvira stoga od vrha do dna:

  • The hodati() metoda može pretvoriti tok okvira stoga - Streamna bilo što
  • Prvi element u danom toku je gornji okvir na stogu
  • Gornji okvir na stogu uvijek predstavlja trenutno izvršnu metodu

Stoga, ako iz streama dobijemo prvi element, znat ćemo detalje trenutno izvršene metode. Točnije, možemo koristiti StackFrame.getMethodName () pronaći naziv metode.

2.1. Prednosti

U usporedbi s drugim pristupima (o njima više kasnije), Stack-Walking API ima nekoliko prednosti:

  • Nema potrebe za izradom lažne anonimne instance unutarnje klase - novi objekt (). getClass () {}
  • Ne treba stvoriti lažnu iznimku - novo bacivo ()
  • Ne trebate željno uhvatiti cijeli trag stoga, što može biti skupo

Naprotiv, StackWalker samo lijeno šeće hrpom jedan po jedan. U ovom slučaju, dohvaća samo gornji kadar, za razliku od pristupa stacktraceu koji željno hvata sve okvire.

Dno crta je da koristite API-je Stack-Walking ako ste na Javi 9+.

3. Korištenje getEnclosingMethod

Naziv metode koja se izvršava možemo pronaći pomoću getEnclosingMethod () API:

javna praznina givenObject_whenGetEnclosingMethod_thenFindMethod () {Metoda niza = novi objekt () {} .getClass () .getEnclosingMethod () .getName (); assertEquals ("givenObject_whenGetEnclosingMethod_thenFindMethod", methodName); }

4. Korištenje Bacljivo Trag stoga

Korištenje a Bacljivo trag steka daje nam trag stoga s metodom koja se trenutno izvršava:

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

5. Korištenje traga nabora niti

Također, trag steka trenutne niti (od JDK 1.5) obično uključuje ime metode koja se izvršava:

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

Međutim, moramo imati na umu da ovo rješenje ima jedan značajan nedostatak. Neki virtualni strojevi mogu preskočiti jedan ili više okvira stoga. Iako to nije uobičajeno, trebali bismo biti svjesni da se to može dogoditi.

6. Zaključak

U ovom uputstvu predstavili smo nekoliko primjera kako dobiti ime trenutno izvršene metode. Primjeri se temelje na tragovima stoga i getEnclosingMethod ().

Kao i uvijek, primjere iz ovog članka možete pogledati na GitHubu. Također, primjeri Java 9 dostupni su u našem Java 9 GitHub modulu.


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