Makalah ini menganalisis mekanisme refleksi Java dalam sebuah contoh. Bagikan untuk referensi Anda, sebagai berikut:
Refleksi, saya sering mendengar mereka mengatakan bahwa saya telah membaca beberapa bahan dan mungkin menggunakannya dalam pola desain, tetapi saya merasa bahwa saya tidak memiliki pemahaman yang lebih dalam tentang hal itu.
1. Mari kita lihat konsep refleksi:
Ini terutama mengacu pada kemampuan yang dapat diakses oleh suatu program, mendeteksi, dan memodifikasi keadaan atau perilakunya sendiri, dan dapat menyesuaikan atau memodifikasi keadaan dan semantik terkait dari aplikasi yang dijelaskan perilaku berdasarkan keadaan dan hasil perilakunya sendiri.
Refleksi adalah alat yang ampuh di Java yang memungkinkan kita untuk dengan mudah membuat kode fleksibel yang dapat dirakit saat berjalan tanpa harus menghubungkan kode sumber antar komponen. Tapi penggunaan refleksi yang tidak tepat akan sangat mahal!
Sangat pusing untuk melihat konsepnya, terus membaca.
2. Peran mekanisme refleksi:
1. Dekompilasi: .class->. Java
2. Akses properti, metode, konstruktor, dll. Dari objek Java melalui mekanisme refleksi;
Ini tampaknya lebih mudah dipahami.
3. Mari kita lihat kelas pertama yang Sun memberi kita mekanisme refleksi:
java.lang.class; java.lang.reflect.constructor;
Kami dapat menanyakan banyak metode, atribut, dan operasi lainnya dalam refleksi dari empat kelas ini. Atau apakah Anda perlu belajar untuk terus -menerus meminta API?
4. Implementasi Fungsi Khusus:
1. Ada tiga cara untuk mendapatkan mekanisme kelas dengan refleksi.
// Metode pertama: classc1 = class.forname ("karyawan"); Objek dalam bahasa Java memiliki Metode GetSclass karyawan = karyawan baru ();2. Buat objek: Setelah mendapatkan kelas, kami akan membuat objeknya dan menggunakan newinstance:
Class c = class.forname ("karyawan"); // Buat instance baru dari kelas yang diwakili oleh objek kelas ini = C.NewInstance ();3. Dapatkan atribut: dibagi menjadi semua atribut dan atribut yang ditentukan:
①. Pertama melihat metode penulisan untuk mendapatkan semua atribut:
// Dapatkan seluruh kelas kelas c = class.forname ("java.lang.integer"); // Dapatkan semua atribut? Field [] fs = c.getDeclaredFields (); // Tentukan string panjang variabel, gunakan untuk menyimpan Atribut StringBuffer SB = New StringBuffer (); // Pisahkan setiap atribut menjadi string ini dengan menambahkan metode // definisi publik terluar sb.append (modifier.tostring (c.getModifiers ()) + "class" + c.getsimpleName (c.getModifiers ()) + "class" + c.getSimplename ( ) +"{/n"); // setiap properti di dalam untuk (bidang bidang: fs) {sb.append ("/t"); // spasi sb.append (pengubah .toString (field.getModifiers ()) + + ""); // Dapatkan pengubah atribut, seperti publik, statis, dll. SB.Append (field.getType (). GetSImplename () + ""); // Dapatkan nama jenis atribut SB.Append ( field.getName () + ";/n"); // Nama properti + enter} sb.append ("}"); System.out.println (SB);②. Dapatkan atribut spesifik dan bandingkan metode tradisional untuk belajar:
public static void main (string [] args) melempar pengecualian {<span style = "white-space: pre"> </span> // cara sebelumnya:/* pengguna u = pengguna baru (); // atur System.out.println (U.age); ); // Tetapkan nilai "110" ke atribut ID dari objek I IDF.set (o, "110");4. Dapatkan metode dan metode konstruksi, tidak lagi menjelaskan secara rinci, lihat saja kata kunci:
Kata kunci metode
arti
getDeclaredMethods ()
Dapatkan semua metode
getReturnType ()
Dapatkan jenis metode pengembalian
getParametertypes ()
Dapatkan jenis parameter yang masuk dari metode ini
getDeclaredMethod ("Metode nama", parameter type.class, ...)
Dapatkan metode tertentu
Kata kunci konstruktor
arti
getDeclaredConstructors ()
Dapatkan semua konstruktor
getDeclaredConstructor (parameter type.class, ...)
Dapatkan konstruktor tertentu
Kelas induk dan antarmuka orang tua
arti
getSuperclass ()
Dapatkan kelas induk dari kelas tertentu
getInterfaces ()
Dapatkan antarmuka untuk jenis implementasi tertentu
Dengan cara ini, kita bisa mendapatkan berbagai konten kelas dan mendekompilasi. Untuk bahasa seperti Java yang dikompilasi terlebih dahulu dan kemudian berjalan, mekanisme refleksi dapat membuat kode lebih fleksibel dan lebih mudah untuk mengimplementasikan berorientasi objek.
5. Refleksi ditambah file konfigurasi membuat program kami lebih fleksibel:
Dalam studi pola desain, ketika belajar pabrik abstrak, refleksi digunakan untuk lebih mudah membaca string tautan basis data, dll., Jadi saya tidak memahaminya pada waktu itu, jadi saya menyalinnya sesuai. Lihatlah penggunaan file konfigurasi refleksi + di .net:
File konfigurasi yang digunakan pada waktu itu adalah file app.config, dan kontennya dalam format XML, dan isi dari database tertaut diisi:
<Configuration> <appsettings> <tambahkan key = "" value = ""/> </pigentsettings> </configuration>
Bagaimana menulis refleksi:
Assembly.Load ("Nama perakitan saat ini"). CreateInstance ("Nama namespace saat ini". Nama kelas yang akan dipakai);
Keuntungan ini adalah mudah untuk memfasilitasi kami untuk mengubah database. untuk memilihnya.
Tentu saja, hal yang sama berlaku di Java, kecuali bahwa file konfigurasi di sini adalah .Properties, disebut file properti. Baca isinya di dalamnya melalui refleksi. Dengan cara ini kode diperbaiki, tetapi kami dapat mengubah konten file konfigurasi, yang membuat kode kami jauh lebih fleksibel!
Singkatnya, mempelajari refleksi java lagi dan menggunakannya secara fleksibel dapat membuat kode kami lebih fleksibel, tetapi juga memiliki kelemahan, yaitu, menggunakannya akan mengurangi kinerja perangkat lunak kami dan meningkatkan kompleksitas, jadi kami juga perlu menggunakannya dengan hati-hati.
Saya harap artikel ini akan membantu pemrograman Java semua orang.