Mekanisme Refleksi Java dalam keadaan berjalan. Metode objek disebut mekanisme refleksi bahasa Java. Konsep refleksi pertama kali diusulkan oleh Smith pada tahun 1982, terutama merujuk pada kemampuan yang dapat diakses oleh suatu program, mendeteksi, dan memodifikasi keadaan atau perilakunya sendiri. Proposal konsep ini dengan cepat memicu penelitian tentang reflektivitas terapan di bidang ilmu komputer. Ini pertama kali diadopsi di bidang desain bahasa pemrograman dan pencapaian pencapaian di LISP dan berorientasi objek. Tentu saja refleksi itu sendiri bukanlah konsep baru.
Mekanisme refleksi Java terutama memberikan penggunaan berikut:
Tentukan kelas yang dimiliki objek mana pun saat runtime
Bangun objek dari kelas mana pun saat runtime
Tentukan variabel anggota dan metode kelas mana pun saat runtime
Metode panggilan objek apa pun saat runtime
Pertama, mari kita lihat contoh sederhana, dan gunakan contoh ini untuk memahami bagaimana mekanisme refleksi Java bekerja.
Paket com.wanggc.reflection; import java.lang.reflect.method;/*** latihan refleksi java. * * @author wanggc * /kelas publik fornametest { /** * Fungsi entri. * * @param args * parameter * @throws Exception * pesan kesalahan */ public static void main (string [] args) melempar pengecualian {// dapatkan kelas kelas <?> cls = class.fornam e (args [0]); / / Dapatkan objek yang sesuai melalui metode kelas [] Metode = cls.getMethods ();Ketika parameter yang diteruskan adalah java.lang.string, hasil berikut akan menjadi output
public boolean java.lang.string.equals (java.lang.Object) public java.lang.string java.lang.string.tostring () public int java.lang.string.hashcode () pu blic int java.lang.string CompareTo (java.lang.string) public int java.lang.string.Compareto (java.lang.Object) public int java.lang.string.indexof (int) public int java.lang.strin g.indexof (int,, int, int) public int java.lang.string.indexof (java.lang.string) public int java.lang.string.indexof (java.lang.string, int) public static java.lang.string java.lang .String.valueof public static public (int) public static java.lang.string java.lang.string.valueof (char) public static java.lang.string java.lang.string java.lang.String.Valueof (Boolean) public static java.lang.st ring public java.lang.string.valueof (float) public static java.lang.string java.lang.string.valueof (char [], int, int) public static java.lang.string java.lang.string.valueof (ganda) publik tatic java.lang.string java .lang.string.valueof (char []) public static Java.lang.string java.lang.string.valueof (java.lang.object) public static java.lang.string Java. Lang.string. Str ing.codepointcount (int, int) public int java.lang.string.Comparetoignorecase (java.lang.string) public java.lang.string java.lang.string.concat (java.lang.string) boolean java.lang public boolean public. .String .contains (java.lang.charequence) public boolean java.lang.string.contentequals (java.lang.charequence) public boolean java.lang.string.contentequals (java.lang.stringbuffer) state public java.Lang. String java.lang.string.copyvalueof (char []) public static java.lang.string java.lang.string.copyvalueof (char [], int, int) public boolean java.lang.string.endswith (java.lang. String) public boolean java.lang.string.equalsignorecase (java.lang.string) public static java.lang.string java.lang.string.format (java.lang.string, java.lang.object []) public static Java public static public .lang.string java.lang.st ring.format (java.util.locale, java.lang.string, java.lang.object []) byte publik [] java.lang.string.getbytes (java.lang.string ) melempar java.io.unsupportedenc OddExceptionPublic void java.lang. getbytes (java.nio.charset.char set) public void java .lang.string.getchars (int, int, char [], int) Public asli java.lang.string java.lang.string.intern () public boolean java publik java publik .lang.string.isempty () Public Int J Ava.lang. ) Public int java.lan g.string.LastIndexof (java.lang. String, int) public int java.lang.string.length () public boolean java.lang.string.matches (java.lang.string) publik int java publik .lang.string.offsetByCodepoin TS (int, int) Publik boolean java.lang .string.regionmatches (boolean, int, java.lang.string, int, int, int) public boolean java.lang.string.regionmatches (int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, java.lang.string, int, int) public java.lan g.string java.lang .string.replace (java.lang.charequence, java.lang.charequence) public Java.lang.string java.lang.string.Replace (char, char) public java.lang.string java .lang.string.replaceall (java .lang.string, java.lang.string) public java.lang.string.string.string.replacefirst (java.lang.string , java.lang.string) publik java.lang.string [] java.lan g.string .split (java.lang.string) public java.lang.string [] java.lang.string.split (java.lang. String, int) public boolean java.lang.string.startswith (java.lang.st cincin) public boolean java.lang.string.startswith (java.lang.string, int) public Java.lang.CharePreence java.lang.string .subeSetence (int, int) publik java.lang.string j ava.lang.string.substring (int) public Java.lang.string java.lang.string.substring (int, int) char publik [] java.lang. String.tochararray () public java.lang.string java.lang.string.tolow ercase () public java. .String java.lang.string.touppercase () public java.lang.string java.lang.string ing. void java.lang.object.wait (long) melempar java.lang.interruptedExceptionPub LIC final void java.lang.object.wait () melempar java .Lang.InterruptExceptionPublic final void java.lang.object.wait (Long, Int) Throws java.lang.InterruptExceptionPublic Final Java.lang.Cla SS Java.lang.Object.getClass () Final Public Void Java.Lang.Object.
Ini mencantumkan semua nama metode, karakter pembatasnya, jenis pengembalian dan pengecualian dari kelas java.lang.string. Program ini menggunakan metode forname kelas kelas untuk memuat kelas yang ditentukan, dan kemudian memanggil metode GetMethods untuk mengembalikan daftar metode dari kelas yang ditentukan. java.lang.reflect.method digunakan untuk mengekspresikan metode tunggal di kelas tertentu.
Menggunakan mekanisme refleksi Java umumnya membutuhkan tiga langkah:
Dapatkan objek kelas Anda ingin mengoperasikan kelas melalui objek kelas yang diperoleh pada langkah pertama untuk mendapatkan metode kelas atau metode atau atribut yang diperoleh pada langkah kedua dari operasi nama kelas.
Ketika Java sedang berjalan, tidak peduli berapa banyak objek yang dihasilkan kelas tertentu, mereka akan sesuai dengan objek kelas yang sama, yang mewakili kelas dan antarmuka dalam program yang sedang berjalan. Ada tiga cara umum untuk mendapatkan objek kelas dari kelas operasi:
Metode statis kelas panggilan name, seperti yang ditunjukkan pada contoh di atas;
Gunakan sintaks .class dari kelas, seperti: kelas <?> Cls = string.class;
Panggil metode getClass dari objek, seperti: String str = "ABC";
Berikut ini akan menggunakan contoh untuk menggambarkan cara menjalankan metode tertentu dari suatu objek melalui tiga langkah yang disebutkan di atas:
paket com.wanggc.reflection; * @Author wanggc */ Public Class ReflectionTest {public static void main (string [] args) melempar Exception {display display = new display (); Dapatkan metode acara dari Metode Tampilan melalui Metode Kelas = Cls.GetMethod ("Show", String.class); void show (nama string) {System.out.println ("Hello:" + Name);Seperti disebutkan sebelumnya, setiap kelas program Java akan memiliki objek kelas yang sesuai dengannya. Langkah pertama dalam refleksi Java adalah untuk mendapatkan objek kelas ini, seperti 14 baris kode. Tentu saja, metode masing -masing kelas juga harus memiliki objek metode yang sesuai dengannya. Untuk memanggil metode ini melalui refleksi, Anda harus terlebih dahulu mendapatkan objek metode dari metode ini, seperti baris 16 kode, dan kemudian menggunakan objek metode untuk memanggil metode ini secara bergantian, seperti baris 18 kode. Perhatikan bahwa parameter pertama dari metode getMethod di baris 16 adalah nama metode, dan yang kedua adalah jenis parameter dari metode ini. Eksekusi metode Invoke dari 18 baris kode, yang sebenarnya merupakan metode show Parameter adalah untuk meneruskannya ke metode show. Jenis dan angka harus konsisten dengan metode getMethod dari 16 baris.
Contoh di atas menunjukkan cara memanggil metode kelas tertentu melalui refleksi.
paket com.wanggc.reflection; * * @author wanggc */ kelas publik reflectionTest {public static void main (string [] args) melempar pengecualian {// buat siswa objek siswa = siswa baru (); ; student.setStuAge(); // Create copy target object Student destStudent = new Student(); // Copy the student object copyBean(student, destStudent); // Output copy result System.out.println(dest Student.getStuName( ) + ":" + deststudent.getStuage ());} /*** Salin informasi objek siswa. * * @param from * Copy the source object* @param dest * Copy the target object* @throws Exception * Exception */ private static void copyBean(Object from, Object dest) throws Exception { // Get the Class object of the copy source object Class< ?> fromClass = from.getClass(); // Get the attribute list of the copy source object Field[] fromFields = fromClass.getDeclaredFields(); // Get the Class object of the copy target object Class<? > destClass = dest.getClass() ; Field destField = null; for (Field fromField : fromFields) { // Get the attribute name of the copy source object String name = fromField.getName(); // Get the attribute of the same nama objek target salinan Destfield = destc lass.getdeclaredfield (nama); objek ke atribut yang sesuai dari objek target salinan Destfield.set (Dest, Fromfield .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::: Get (From))) ;}}} /*** Kelas Siswa. * / class student { / ** nama* / private string stuname; / ** usia* / stuage pribadi; ** @Return nama siswa*/ string publik getStuname () {return stuname; } / *** Dapatkan Usia Siswa** @Return Siswa Usia* / Public Int GetStuage () {return stuage; ) {this.stuage = stuage;}}Dalam mekanisme peluncuran Java, kelas sesuai dengan kelas, metode kelas sesuai dengan metode, dan tentu saja properti juga sesuai dengan bidang. Komentar dalam kode telah dikomentari secara rinci dan tidak akan diulangi di sini. Tetapi ketahuilah bahwa bidang menyediakan metode get dan atur untuk mendapatkan dan atur nilai -nilai atribut, tetapi karena atributnya adalah jenis pribadi, aksesibilitas atribut perlu diatur ke true, seperti baris 50 ~ 51 dari kode. Anda juga dapat menetapkan aksesibilitas untuk seluruh bidang dan menggunakan metode statis yang dapat diakses yang dapat ditetapkan di bawah 40 baris, seperti: AccessableObject.setAccessible (dari Fields, True);
Deskripsi sebelumnya menunjukkan cara menggunakan mekanisme refleksi Java untuk mengoperasikan metode dan sifat kelas.
paket com.wanggc.reflection; * * @author wanggc */ kelas publik reflectionTest {public static void main (string [] args) melempar pengecualian {// buat siswa objek siswa = siswa baru (); ; ());} /*** Salin informasi objek siswa. * * @param dari * Salin objek sumber * @param dest * Salin objek target * @throws Exception * Exception */ Private Static Object CopyBean (objek dari) melempar Exception {// Dapatkan Objek Salin Objek dari Kelas Objek Sumber < > fromclass = from.getClass (); // Dapatkan daftar atribut bidang Sumber Sumber [] FromFields = FromClass.getDeclaredFields (); (); set (ints, fromfield.get (dari)); * / class student { / ** nama* / private string stuname; / ** usia* / stuage pribadi; ** @Return nama siswa*/ string publik getStuname () {return stuname; } / *** Dapatkan Usia Siswa** @Return Siswa Usia* / Public Int GetStuage () {return stuage; ) {this.stuage = stuage;}}Hasil dari contoh ini dan contoh sebelumnya adalah sama. Namun, objek yang dikembalikan dengan metode copybean tidak lagi diteruskan di luar, tetapi dihasilkan secara internal dengan metode, seperti yang ditunjukkan dalam kode pada baris 40. Catatan: Metode NewInstance kelas hanya dapat membuat kelas yang berisi konstruktor tanpa parameter. wanggc ");
Pada titik ini, fungsi umum dari mekanisme refleksi Java (metode panggilan objek saat runtime, penggunaan atribut kelas, dan penciptaan objek kelas) telah diperkenalkan.
Suplemen: Saat memperoleh metode, properti dan konstruktor kelas, ada dua metode yang sesuai: getXXX dan getGetDeclaredXxx. Perbedaannya adalah bahwa yang pertama mengembalikan metode dan properti dengan hak akses publik, termasuk yang ada di kelas induk;
Konten di atas adalah mekanisme peluncuran Java yang diperkenalkan kepada Anda, saya harap Anda menyukainya.