Refleksi adalah fitur penting dari bahasa Java. Kita tahu bahwa sebelum menggunakan suatu kelas, kita sering kali sudah membuatnya, seperti membuat file kelas, lalu menulis beberapa atribut, metode, dll., yaitu kelas semacam ini. Ini statis, tetapi mekanisme refleksi memungkinkan Anda membuat kelas secara dinamis. Selain membuat kelas secara dinamis, kita juga dapat memperoleh data objek serupa secara dinamis dan menetapkan data tersebut ke kelas yang baru dibuat, yang agak mirip dengan kloning. Seringkali, kita memerlukan fitur pembuatan kelas secara dinamis ini, misalnya saat memproses beberapa bisnis, tetapi bisnis ini sedikit berbeda, sering kali berhubungan dengan beberapa kelas, saat memproses, kita harus mendasarkan pada pemrosesan Bisnis yang berbeda untuk memanggil kelas yang berbeda. kali ini mekanisme refleksi berguna.
Berikut deskripsi paket java.lang.reflect di JDK API:
Menyediakan kelas dan antarmuka untuk memperoleh informasi refleksi tentang kelas dan objek. Dalam batasan keamanan, refleksi memungkinkan akses terprogram ke informasi tentang bidang, metode, dan konstruktor kelas yang dimuat, dan memungkinkan penggunaan bidang, metode, dan konstruktor yang dipantulkan untuk beroperasi pada persamaan yang mendasari suatu objek.
AccessibleObject memungkinkan pemeriksaan akses disembunyikan jika ReflectPermission yang diperlukan tersedia.
Array menyediakan metode statis untuk membuat dan mengakses array secara dinamis.
Kelas-kelas dalam paket ini, serta java.lang.Class, dapat disesuaikan dengan kebutuhan aplikasi seperti debugger, interpreter, pemeriksa objek, browser kelas, dan layanan (seperti Object Serialization dan JavaBeans) yang perlu mengakses target objek berdasarkan anggota publik kelas runtimenya) atau anggota yang dideklarasikan oleh kelas tertentu).
Berikut ini menggunakan dua contoh sederhana untuk mengilustrasikan penggunaan refleksi. Pertama, buat kelas Person:
Copy kode kodenya sebagai berikut:
tes paket;
kelas publik Orang {
usia swasta;
nama String pribadi = "";
pribadi String[] arr = String baru[2];
Orang Publik(){}
Orang Publik(Nama string,int umur){
ini.nama = nama;
this.usia = usia;
}
publik int getUmur() {
usia kembali;
}
public void setAge(int usia) {
this.usia = usia;
}
String publik getName() {
nama kembali;
}
public void setName(Nama string) {
ini.nama = nama;
}
String publik[] getArr() {
kembali arr;
}
kekosongan publik setArr(String[] arr) {
ini.arr = arr;
}
}
Contoh 1: Dapatkan informasi atribut dan metode kelas Person. Salin kode sebagai berikut:
kekosongan statis pribadi testSimpleReflect(){
String className = "tes.Orang";
mencoba {
Kelas c = Kelas.forName(className);
Bidang[] bidang = c.getDeclaredFields();
Metode[] m = c.getDeclaredMethods();
for (Bidang bidang : bidang){
Sistem.keluar.println(field.getName());
}
for (Metode metode : m){
Sistem.keluar.println(m.getClass());
}
} tangkapan (ClassNotFoundException e) {
e.printStackTrace();
}
}
Ini sangat sederhana. Anda bisa mendapatkan kelas melalui jalur paket tempat kelas tersebut berada. Dalam pekerjaan sebenarnya, ini juga yang paling banyak digunakan.
Contoh 2: Salinan objek Salin kode Kodenya adalah sebagai berikut:
@SuppressWarnings("tidak dicentang")
salinan Objek statis publik (Objek objek) memunculkan Pengecualian {
// Dapatkan tipe objeknya
Kelas classType = objek.getClass();
System.out.println("" + classType.getName()); // Membuat objek baru melalui metode konstruksi default
Objek objectCopy = classType.getConstructor(Kelas baru[] {})
.newInstance(new Object[] {}); // Dapatkan semua properti objek
Bidang bidang[] = classType.getDeclaredFields();
for (int i = 0; i < bidang.panjang; i++) {
Bidang bidang = bidang[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase(); // Dapatkan nama metode getXXX() yang sesuai dengan atributnya
String getMethodName = "get" + firstLetter + fieldName.substring(1); // Dapatkan nama metode setXXX() yang sesuai dengan atributnya
String setMethodName = "set" + firstLetter + fieldName.substring(1); // Dapatkan metode getXXX() yang sesuai dengan atribut
Metode getMethod = classType.getMethod(getMethodName,
new Class[] {}); // Dapatkan metode setXXX() yang sesuai dengan atribut
Metode setMethod = classType.getMethod(setMethodName,
new Class[] { field.getType() }); // Memanggil metode getXXX() dari objek aslinya
Nilai objek = getMethod.invoke(objek, Objek baru[] {});
System.out.println(fieldName + ":" + value); // Panggil metode setXXX() dari objek yang disalin
setMethod.invoke(objectCopy, Objek baru[] { nilai });
}
kembalikan objekSalinan;
}
Menggunakan refleksi untuk menyalin objek, biasanya kita tidak perlu melakukannya sendiri, karena sistem open source BeanUtils telah mengenkapsulasi salinan objek untuk kita. Kita cukup memanggil metodenya secara langsung, tetapi perlu dicatat bahwa BeanUtils juga berbasis pada mekanisme refleksi
Ini panggilannya:
Copy kode kodenya sebagai berikut:
public static void main(String[] args){
Orang orang = Orang baru("tom",22);
String[] strs = String baru[]{"a","b"};
orang.setArr(strs);
mencoba {
Orang p = (Orang)salinan(orang);
System.out.println(p.getName()+">>"+p.getAge());
untuk (String str : p.getArr()){
Sistem.keluar.println(str);
}
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
// tesSimpleReflect();
}