Bagaimana Mendapatkan Nama Kaedah yang Dijalankan?

1. Gambaran keseluruhan

Kadang-kadang kita perlu mengetahui nama kaedah Java yang sedang dijalankan.

Artikel ringkas ini memaparkan beberapa cara mudah untuk mendapatkan nama kaedah dalam timbunan pelaksanaan semasa.

2. Java 9: ​​API Stack-Walking

Java 9 memperkenalkan Stack-Walking API untuk melintasi bingkai stack JVM dengan cara yang malas dan cekap. Untuk mencari kaedah yang sedang dijalankan dengan API ini, kita dapat menulis ujian mudah:

public void givenJava9_whenWalkingTheStack_thenFindMethod() { StackWalker walker = StackWalker.getInstance(); Optional methodName = walker.walk(frames -> frames .findFirst() .map(StackWalker.StackFrame::getMethodName)); assertTrue(methodName.isPresent()); assertEquals("givenJava9_whenWalkingTheStack_thenFindMethod", methodName.get()); }

Pertama, kita mendapat contoh StackWalker menggunakan kaedah kilang getInstance () . Kemudian kami menggunakan kaedah walk () untuk melintasi bingkai timbunan dari atas ke bawah:

  • Kaedah walk () dapat menukar aliran bingkai tumpukan - Stream - kepada apa sahaja
  • Elemen pertama dalam aliran yang diberikan adalah bingkai atas pada timbunan
  • Bingkai atas pada timbunan selalu mewakili kaedah yang sedang dijalankan

Oleh itu, jika kita mendapat elemen pertama dari aliran, kita akan mengetahui perincian kaedah yang sedang dijalankan. Lebih khusus lagi, kita boleh menggunakan StackFrame.getMethodName () untuk mencari nama kaedah.

2.1. Kelebihan

Berbanding dengan pendekatan lain (lebih banyak mengenai mereka kemudian), Stack-Walking API mempunyai beberapa kelebihan:

  • Tidak perlu membuat contoh kelas dalaman tanpa nama palsu - Objek baru (). GetClass () {}
  • Tidak perlu membuat pengecualian dummy - Throwable baru ()
  • Tidak perlu dengan bersungguh-sungguh menangkap keseluruhan stacktrace, yang harganya mahal

Sebaliknya, StackWalker hanya berjalan setumpuk satu persatu dengan cara malas. Dalam hal ini, hanya mengambil bingkai atas, berbanding dengan pendekatan stacktrace yang menangkap semua bingkai dengan penuh semangat.

Intinya adalah, gunakan Stack-Walking API jika anda menggunakan Java 9+.

3. Menggunakan kaedah getEnclosing

Kita dapat mencari nama kaedah yang dijalankan dengan menggunakan getEnclosingMethod () API:

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

4. Menggunakan Trackable Stack Trace

Menggunakan trace stack Throwable memberi kita jejak stack dengan kaedah yang sedang dijalankan:

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

5. Menggunakan Thread Stack Trace

Juga, jejak timbunan utas semasa (sejak JDK 1.5) biasanya merangkumi nama kaedah yang sedang dijalankan:

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

Walau bagaimanapun, kita perlu ingat bahawa penyelesaian ini mempunyai satu kelemahan yang ketara. Beberapa mesin maya mungkin melangkau satu atau lebih bingkai timbunan. Walaupun ini tidak biasa, kita harus sedar bahawa ini boleh berlaku.

6. Kesimpulannya

Dalam tutorial ini, kami telah menunjukkan beberapa contoh bagaimana mendapatkan nama kaedah yang sedang dijalankan. Contohnya berdasarkan jejak tumpukan dan getEnclosingMethod () .

Seperti biasa, anda boleh melihat contoh yang diberikan dalam artikel ini di GitHub. Juga, contoh Java 9 terdapat dalam modul Java 9 GitHub kami.