Bagaimana Cara Mendapatkan Nama dari Metode yang Dieksekusi?

1. Ikhtisar

Terkadang kita perlu mengetahui nama metode Java yang sedang dijalankan.

Artikel singkat ini menyajikan beberapa cara sederhana untuk mendapatkan nama metode dalam tumpukan eksekusi saat ini.

2. Java 9: ​​API Stack-Walking

Java 9 memperkenalkan Stack-Walking API untuk melintasi bingkai tumpukan JVM dengan cara yang lambat dan efisien. Untuk menemukan metode yang sedang dijalankan dengan API ini, kita dapat menulis tes sederhana:

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 mendapatkan instance StackWalker menggunakan metode pabrik getInstance () . Kemudian kami menggunakan metode walk () untuk melintasi bingkai tumpukan dari atas ke bawah:

  • Metode walk () dapat mengubah aliran bingkai tumpukan - Aliran - untuk apapun
  • Elemen pertama dalam aliran yang diberikan adalah bingkai teratas di tumpukan
  • Bingkai atas di tumpukan selalu mewakili metode yang sedang dijalankan

Oleh karena itu, jika kita mendapatkan elemen pertama dari aliran, kita akan mengetahui detail metode yang sedang dijalankan. Lebih khusus lagi, kita bisa menggunakan StackFrame.getMethodName () untuk menemukan nama metode.

2.1. Keuntungan

Dibandingkan dengan pendekatan lain (akan dijelaskan lebih lanjut nanti), Stack-Walking API memiliki beberapa keunggulan:

  • Tidak perlu membuat instance kelas dalam anonim tiruan - Object baru (). GetClass () {}
  • Tidak perlu membuat pengecualian dummy - Throwable () baru
  • Tidak perlu mengambil gambar seluruh stacktrace dengan penuh semangat, yang bisa jadi mahal

Sebaliknya, StackWalker hanya menjalankan tumpukan satu per satu dengan cara malas. Dalam hal ini, ini hanya mengambil bingkai atas, berlawanan dengan pendekatan stacktrace yang menangkap semua bingkai dengan penuh semangat.

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

3. Menggunakan getEnclosingMethod

Kita bisa menemukan nama metode yang dieksekusi dengan menggunakan API getEnclosingMethod () :

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

4. Menggunakan Throwable Stack Trace

Menggunakan pelacakan tumpukan yang dapat dilempar memberi kami pelacakan tumpukan dengan metode yang saat ini sedang dijalankan:

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

5. Menggunakan Thread Stack Trace

Selain itu, pelacakan tumpukan dari utas saat ini (karena JDK 1.5) biasanya menyertakan nama metode yang sedang dieksekusi:

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

Namun, perlu diingat bahwa solusi ini memiliki satu kekurangan yang signifikan. Beberapa mesin virtual mungkin melewatkan satu atau lebih bingkai tumpukan. Meskipun ini tidak umum, kita harus waspada bahwa ini bisa terjadi.

6. Kesimpulan

Dalam tutorial ini, kami telah menyajikan beberapa contoh cara mendapatkan nama metode yang saat ini dijalankan. Contohnya didasarkan pada pelacakan tumpukan dan getEnclosingMethod () .

Seperti biasa, Anda dapat melihat contoh yang diberikan dalam artikel ini di GitHub. Selain itu, contoh Java 9 tersedia di modul Java 9 GitHub kami.