Kata pengantar
Semua orang tahu bahwa dengan penggunaan Java8, parameter objek baru telah ditambahkan ke tanda tangan metode yang sesuai untuk mewakili informasi parameter tertentu. Nama parameter yang sesuai dapat diperoleh melalui nama get -nya. Yaitu, seperti tertulis dalam kode, seperti nama pengguna, ketika melewati parameter di latar depan, tidak perlu menulis anotasi seperti kelas @parameter ("nama pengguna"), tetapi dapat secara langsung memetakan dengan nama.
Referensi kode berikut ditampilkan:
kelas publik t {private interface t2 {void metode (string username, string password); } public static void main (string [] args) melempar Exception {System.out.println (t.class.getMethod ("main", string []. class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("Metode", String.class, String.Class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("Metode", String.class, String.class) .getParameters () [1] .getName ()); }} Sebelum Java8, Anda juga bisa mendapatkan informasi nama parameter melalui beberapa cara, tetapi metodenya berbeda. Misalnya, ParameterMethodNameResolver di Spring MVC juga dapat bekerja secara normal di versi sebelumnya. Namun, itu hanya membutuhkan kompilasi khusus. Apa yang berhasil di sini adalah LocalVariableTable dan MethodParameters , yang dikompilasi ke dalam tabel variabel lokal dan tabel parameter metode dalam bahasa Cina.
Tabel variabel lokalvariabletable lokal
Menurut spesifikasi JVM, tabel variabel lokal ada dalam atribut kode, dan atribut kode juga merupakan atribut MethodInfo. Dapat dipahami bahwa ketika suatu metode memiliki badan metode, atribut kode yang sesuai akan muncul. Dalam atribut kode, selain eksekusi kode tertentu, akan ada informasi lain. Misalnya, LinenumberTable (digunakan untuk menggambarkan lokasi setiap baris kode).
Tabel variabel lokal adalah bagian dari informasi debugging dalam metode ini, jadi secara default informasi ini tidak akan dihasilkan dalam file kelas. Sakelar -g atau -g: vars perlu dihidupkan. Untungnya, untuk kompilasi IDE atau MAVEN, sakelar ini dihidupkan secara default. Di IDE, Anda dapat mengontrolnya dengan pengaturan (menghasilkan info debugging untuk ide) (cek default). Di Maven, apakah output dikendalikan oleh debugging atau debuglevel dalam plug-in maven-kompiler-plugin (nilai default benar).
Tabel variabel lokal adalah setelah javap, sebagai berikut:
// Metode non-statis LocalVariabletable: Mulai Panjang Slot Nama Tanda Tangan 0 1 0 LT ini; 0 1 1 Hitung J 0 1 3 Nama Ljava/Lang/String; // Metode Statis Lokalvariabletable: Mulai Panjang Slot Nama Tanda Tangan 0 101 0 Args [ljava/lang/string;
Tabel variabel lokal tidak hanya menyimpan informasi parameter, tetapi juga menyimpan variabel sementara yang dapat digunakan di seluruh badan metode, seperti int int i, dll. Dan seperti yang ditunjukkan di atas, metode dan metode non-statis memiliki perbedaan antara variabel ini di posisi pertama. Oleh karena itu, Anda dapat membaca jumlah parameter ( method.getParameterCount ), dan kemudian membaca informasi parameter dari nomor yang ditentukan dalam tabel variabel lokal sesuai dengan tanda tangan metode.
Perlu dicatat bahwa pada gambar di atas, jika parameternya panjang atau ganda, slotnya menempati 2 tempat. Saat mendapatkan informasi parameter melalui slot, informasi jenis parameter perlu dipertimbangkan.
Karena metode antarmuka tidak memiliki atribut kode, tidak ada tabel variabel lokal. Jika Anda mendapatkan definisi metode antarmuka, Anda tidak bisa mendapatkan nama parameter yang sesuai melalui tabel variabel lokal.
MethodParameters Tabel Parameter Metode
Tabel parameter metode diperkenalkan setelah 1.8, jadi informasi ini hanya tersedia di file kelas yang dikompilasi dengan JDK8. Berbeda dengan tabel variabel lokal, itu milik atribut MethodInfo, yaitu, pada tingkat yang sama dengan atribut kode. Apakah itu metode antarmuka atau metode biasa, ia memiliki atribut ini. Oleh karena itu, bahkan metode antarmuka dapat memperoleh informasi parameter yang sesuai.
Secara default, informasi ini tidak tersedia di kelas. Parameter kompilasi khusus -Parameter diperlukan untuk menghasilkan, dan informasi ini tidak dihasilkan secara default di Ide dan Maven. Dalam IDEA, parameter kompilasi ini perlu ditambahkan dalam parameter garis tambahan Java. Di Maven, parameter ini perlu ditambahkan dalam parameter compilerArgs dari Maven-kompiler-plugin.
Tabel parameter metode ditampilkan dalam bentuk berikut setelah JAVAP:
// Metode Non-Statis MetodeParameter: Nama Hitung Bendera // Metode Statis MetodeParameter: Name Flags Args
Dapat dilihat bahwa apakah itu statis atau tidak, hanya informasi yang digunakan untuk menggambarkan parameter yang akan muncul di tabel parameter. Parameter bendera berikut digunakan dalam beberapa skenario khusus, seperti parameter final untuk penulisan ulang metode, dll.
Beberapa alat tersedia
Selain menggunakan API asli dan alat Spring, ada alat lain yang bisa mendapatkan informasi nama parameter. Dalam sistem pegas, antarmuka yang digunakan untuk menggambarkan nama parameter adalah ParameterNameDiscoverer . Melalui itu, informasi nama parameter yang sesuai dapat diperoleh. Selain itu, paranamer di com.thoughtworks.paranamer:paranamer toolkit juga dapat memproses informasi yang sesuai. Namun, dukungan untuk MethodParameter JDK8 tidak terlalu tinggi, dan pengguna dapat mencapai tujuan mereka sendiri dengan memperluasnya.
Meringkaskan
Di atas adalah metode untuk mendapatkan informasi nama parameter dari kode Java yang dirangkum oleh Anda. Saya harap ini akan membantu Anda belajar atau menggunakan Java. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.