Apakah ada cara untuk mendapatkan nama metode yang sedang dijalankan di Jawa?
java
reflection
methods
Omar Kooheji
sumber
sumber
Secara teknis ini akan berfungsi ...
Namun, kelas dalam anonim baru akan dibuat selama waktu kompilasi (misalnya
YourClass$1.class
). Jadi ini akan membuat.class
file untuk setiap metode yang menggunakan trik ini. Selain itu instance objek yang tidak digunakan dibuat pada setiap doa selama runtime. Jadi ini mungkin merupakan trik debug yang dapat diterima, tetapi ia datang dengan overhead yang signifikan.Keuntungan dari trik ini adalah
getEncosingMethod()
pengembalianjava.lang.reflect.Method
yang dapat digunakan untuk mengambil semua informasi lain dari metode termasuk anotasi dan nama parameter. Hal ini memungkinkan untuk membedakan antara metode tertentu dengan nama yang sama (kelebihan metode).Perhatikan bahwa menurut JavaDoc
getEnclosingMethod()
trik ini tidak boleh membuangSecurityException
sebagai kelas dalam harus dimuat menggunakan loader kelas yang sama. Jadi tidak perlu memeriksa kondisi akses bahkan jika manajer keamanan hadir.Diperlukan untuk digunakan
getEnclosingConstructor()
untuk konstruktor. Selama blok di luar metode (bernama),getEnclosingMethod()
kembalinull
.sumber
getEnclosingMethod
mendapat nama metode di mana kelas didefinisikan.this.getClass()
tidak akan membantu Anda sama sekali. @wutzebaer mengapa Anda harus melakukannya? Anda sudah memiliki akses ke mereka.Januari 2009:
Kode lengkap akan (untuk digunakan dengan peringatan @ Bombe dalam pikiran):
Lebih banyak di pertanyaan ini .
Pembaruan Desember 2011:
komentar kebiruan :
virgo47 's jawaban (upvoted) benar-benar menghitung indeks yang tepat untuk diterapkan dalam rangka untuk mendapatkan kembali nama metode.
sumber
StackTraceElement
array untuk tujuan debugging dan untuk melihat apakah 'main' sebenarnya metode yang tepat?ste[2 + depth].getMethodName()
. 0 adalahgetStackTrace()
, 1 adalahgetMethodName(int depth)
dan 2 adalah metode memohon. Lihat juga jawaban @ virgo47 .Kami menggunakan kode ini untuk mengurangi kemungkinan variabilitas dalam indeks jejak tumpukan - sekarang panggil saja methodName util:
Tampaknya overengineered, tetapi kami memiliki beberapa nomor tetap untuk JDK 1.5 dan sedikit terkejut itu berubah ketika kami pindah ke JDK 1.6. Sekarang sama di Jawa 6/7, tetapi Anda tidak pernah tahu. Ini bukan bukti perubahan indeks selama runtime - tetapi mudah-mudahan HotSpot tidak melakukan hal yang buruk. :-)
sumber
nama akan memiliki nilai foo.
sumber
null
Kedua opsi ini berfungsi untuk saya dengan Java:
Atau:
sumber
Cara tercepat yang saya temukan adalah:
Ini mengakses metode asli getStackTraceElement (kedalaman int) secara langsung. Dan menyimpan Metode yang dapat diakses dalam variabel statis.
sumber
new Throwable().getStackTrace()
mengambil 5614ms.Gunakan Kode berikut:
sumber
sumber
Ini adalah perluasan dari jawaban virgo47 (di atas).
Ini memberikan beberapa metode statis untuk mendapatkan nama kelas / metode saat ini dan memanggil.
sumber
Untuk mendapatkan nama metode yang disebut metode saat ini, Anda dapat menggunakan:
Ini berfungsi pada MacBook saya dan juga pada ponsel Android saya
Saya juga mencoba:
tapi Android akan mengembalikan "getStackTrace" Saya bisa memperbaiki ini untuk Android
tapi kemudian saya mendapatkan jawaban yang salah di MacBook saya
sumber
getStackTrace()[0]
daripada menggunakangetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
sumber
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
bekerja;e.getClassName();
kembalikan nama kelas penuh dane.getMethodName()
kembalikan nama methon.getStackTrace()[2]
salah, itu pastigetStackTrace()[3]
karena: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] Fungsi a () memanggil yang satu iniIni bisa dilakukan menggunakan
StackWalker
Java 9.StackWalker
dirancang untuk menjadi malas, sehingga cenderung lebih efisien daripada, katakanlah,Thread.getStackTrace
yang dengan bersemangat membuat array untuk seluruh callstack. Lihat juga JEP untuk informasi lebih lanjut.sumber
Metode alternatif adalah membuat, tetapi tidak melempar, Pengecualian, dan menggunakan objek itu untuk mendapatkan data jejak tumpukan, karena metode penutup biasanya akan berada di indeks 0 - selama JVM menyimpan informasi tersebut, seperti yang dimiliki orang lain. disebutkan di atas. Namun ini bukan metode termurah.
Dari Throwable.getStackTrace () (ini sudah sama sejak Java 5 setidaknya):
Cuplikan di bawah ini menganggap kelas adalah non-statis (karena getClass ()), tapi itu samping.
sumber
sumber
Saya punya solusi menggunakan ini (dalam Android)
sumber
Saya tidak tahu apa maksud di balik mendapatkan nama metode yang saat ini dieksekusi, tetapi jika itu hanya untuk tujuan debugging, maka kerangka kerja logging seperti "logback" dapat membantu di sini. Misalnya, dalam logback, yang perlu Anda lakukan adalah menggunakan pola "% M" dalam konfigurasi logging Anda . Namun, ini harus digunakan dengan hati-hati karena ini dapat menurunkan kinerja.
sumber
Untuk berjaga-jaga jika metode yang namanya ingin Anda ketahui adalah metode uji junit, maka Anda dapat menggunakan aturan Junit TestName: https://stackoverflow.com/a/1426730/3076107
sumber
Sebagian besar jawaban di sini tampaknya salah.
Contoh:
Output:
sumber
Saya menulis ulang sedikit jawaban maklemenz :
sumber
sumber
getEnclosingMethod()
melemparNullPointerException
untuk saya di Jawa 7.Apa yang salah dengan pendekatan ini:
Dan sebelum orang tergila-gila menggunakan
System.out.println(...)
Anda selalu, dan harus, membuat beberapa metode sehingga output dapat diarahkan, misalnya:sumber