Banyak kerangka kerja mainstream menggunakan teknologi refleksi. Misalnya, kerangka ssh menggunakan dua teknologi: xml sebagai file konfigurasi + teknologi refleksi.
Paket kelas yang berhubungan dengan refleksi.
java.lang.reflect.*; dan java.lang.Class;
Semua tipe di Java (termasuk tipe dasar) berhubungan dengan objek Kelas, dan Kelas ini adalah java.lang.Class. Artinya, setiap tipe memiliki objek Kelas yang sesuai dengannya di Kelas tidak memiliki konstruktor publik. Perhatikan bahwa ini bukan berarti tidak ada akses publik.
Cara mendapatkan objek Kelas
Copy kode kodenya sebagai berikut:
.Untuk setiap objek.getCalss(), Anda bisa mendapatkan Kelas yang sesuai.
.Class.forName(String), metode penulisan String: nama paket.nama kelas.Objek yang sesuai dengan nama paket.nama kelas akan dibuat.
.Untuk tipe dasar: kelas enkapsulasi. TYPE mewakili objek Kelas dari tipe dasar yang sesuai. Integer.TYPE sesuai dengan objek Kelas int.
.Jenis, Kelas. <Tipe 4 bersifat universal.>
Dari keempat metode di atas, hanya metode 2 yang dinamis. Ubah saja paketnya. Oleh karena itu, jika Anda ingin benar-benar mewujudkan pemrograman dinamis, Anda hanya dapat menggunakan metode 2.
Hanya ada satu objek Kelas untuk setiap tipe, yaitu hanya memiliki satu alamat, tetapi tipe yang berbeda berbeda.
Jadi hasil print berikut ini semuanya benar.
Copy kode kodenya sebagai berikut:
//Jenis pasangan dan referensi
Kelas c1 = "".getClass();
Kelas c2 = Kelas.forName("java.lang.String");
Kelas c3 = String.kelas;
Sistem.keluar.println(c1 ==c2);//benar
//Untuk tipe dasar
Kelas num1 = Integer.TYPE;
Kelas nomor2 = int.kelas;
Sistem.keluar.println(angka1 == angka2);//benar
Refleksi untuk memperoleh metode yang berhubungan dengan anggota dalam suatu kelas
[Dapatkan struktur <sesuai dengan tipe parameter>] (umumnya digunakan tanpa dideklarasikan)
Copy kode kodenya sebagai berikut:
Konstruktor<T> getConstructor(Kelas<?>... Tipe parameter)
Mengembalikan objek Konstruktor yang mencerminkan konstruktor publik tertentu dari kelas yang diwakili oleh objek Kelas ini.
Konstruktor<?>[] getConstructors()
Mengembalikan array yang berisi objek Konstruktor yang mencerminkan semua konstruktor publik kelas yang diwakili oleh objek Kelas ini.
Konstruktor<T> getDeclaredConstructor(Kelas<?>...tipe parameter)
Mengembalikan objek Konstruktor yang mencerminkan metode konstruktor yang ditentukan untuk kelas atau antarmuka yang diwakili oleh objek Kelas ini.
Konstruktor<?>[] getDeclaredConstructors()
Mengembalikan array objek Konstruktor yang mencerminkan semua metode konstruktor yang dideklarasikan oleh kelas yang diwakili oleh objek Kelas ini.
[Dapatkan atribut <sesuai nama atribut>] (biasanya digunakan dengan dideklarasikan, karena atribut umumnya bersifat pribadi)
Copy kode kodenya sebagai berikut:
Bidang getField (Nama string)
Mengembalikan objek Bidang yang mencerminkan bidang anggota publik tertentu dari kelas atau antarmuka yang diwakili oleh objek Kelas ini.
Bidang[] getFields()
Mengembalikan array yang berisi objek Bidang yang mencerminkan semua bidang publik yang dapat diakses dari kelas atau antarmuka yang diwakili oleh objek Kelas ini.
Bidang getDeclaredField (nama string)
Mengembalikan objek Bidang yang mencerminkan bidang tertentu yang dideklarasikan dari kelas atau antarmuka yang diwakili oleh objek Kelas ini.
Bidang[] getDeclaredFields()
Mengembalikan array objek Bidang yang mencerminkan semua bidang yang dideklarasikan oleh kelas atau antarmuka yang diwakili oleh objek Kelas ini.
[Mendapatkan metode <nama metode ditambah tipe parameter>] (biasanya digunakan tanpa dideklarasikan)
Copy kode kodenya sebagai berikut:
Metode getMethod(Nama string, Kelas<?>... Tipe parameter)
Mengembalikan objek Metode yang mencerminkan metode anggota publik tertentu dari kelas atau antarmuka yang diwakili oleh objek Kelas ini.
Metode[] dapatkanMetode()
Mengembalikan array yang berisi objek Metode yang mencerminkan anggota publik dari kelas atau antarmuka yang diwakili oleh objek Kelas ini (termasuk yang dideklarasikan oleh kelas atau antarmuka tersebut dan yang diwarisi dari metode superkelas dan superinterface).
Metode getDeclaredMethod(Nama string, Kelas<?>... Tipe parameter)
Mengembalikan objek Metode yang mencerminkan metode kelas atau antarmuka yang dinyatakan tertentu yang diwakili oleh objek Kelas ini.
Metode[] getDeclaredMethods()
Mengembalikan array objek Metode yang mencerminkan semua metode yang dideklarasikan oleh kelas atau antarmuka yang diwakili oleh objek Kelas ini, termasuk metode publik, dilindungi, akses default (paket), dan metode pribadi, tetapi tidak termasuk metode yang diwariskan.
T Instance baru()
Membuat instance baru dari kelas yang diwakili oleh objek Kelas ini. <Instance baru() dapat membuat objek secara dinamis>
String keString()
Ubah objek menjadi string.
Melihat: newInstance() memanggil konstruktor tanpa parameter. Jika kelas tidak memiliki konstruktor tanpa parameter, newInstance() akan menghasilkan pengecualian.
Metode yang dideklarasikan mendukung privasi, tetapi tidak mendukung warisan. Metode yang tidak dideklarasikan mendukung warisan, tetapi tidak mendukung privasi, dan hanya dapat mengambil hal-hal publik.
Oleh karena itu, properti umumnya dideklarasikan dengan deklarasi, karena properti umumnya bersifat pribadi, metode umumnya diperoleh tanpa deklarasi, dan konstruktor umumnya diperoleh tanpa deklarasi.
Refleksi simulasi instance memperoleh properti dan metode yang relevan di kelas
Menggunakan refleksi untuk memberikan nilai pada properti
Metode di Lapangan
Dapatkan objek(Obj objek)
Mengembalikan nilai bidang yang diwakili oleh Bidang ini pada objek tertentu.
Bidang f = c.getXXField(nama properti);
nilai = f.get(objek);
void set(Obj objek, Nilai objek)
Menyetel bidang yang diwakili oleh objek Bidang ini pada variabel objek tertentu ke nilai baru yang ditentukan.
f.set(objek, nilai);
Kelas<?> getType()
Mengembalikan objek Kelas yang mengidentifikasi tipe bidang yang dideklarasikan yang diwakili oleh objek Bidang ini.
Digunakan untuk mendapatkan tipe atribut (mengembalikan objek Kelas).
Copy kode kodenya sebagai berikut:
Kelas c = Siswa.kelas;
Objek obj = c.newInstance(); //Membuat objek kelas Siswa
Bidang f = c.getDeclaredField("name"); //Dapatkan atribut nama
f.setAccessible(true); //Setel akses pribadi.
f.set(obj, "zhangsan");
System.out.println(f.get(obj)); //Dapatkan nilai atribut nama obj.
Menggunakan refleksi untuk memanggil konstruksi Panggilan sebenarnya ke konstruktor adalah ketika metode newInstance() dipanggil.
Copy kode kodenya sebagai berikut:
Kelas c = Kelas.forName("com.clazz.reflect.Student");
Konstruktor con = c.getConstructor(); //Tidak ada konstruksi yang dilakukan,
Objek cObj = c.getConstructor().newInstance();//Panggil konstruktor tanpa parameter
Konstruktor conAll = c.getConstructor(int.class,String.class,int.class);
Objek caobj = conAll.newInstance(1001,"zjamgs",234235);//Panggil konstruktor dengan parameter.
System.out.println(caobj); //Mencetak keluaran
Memanggil metode menggunakan refleksi Nama Objek.Metode (nilai 1,2,3);
Metode m = c.getMethoed(nama metode, tipe parameter...);
m.invoke (objek, parameter pemanggilan metode) Jika parameter formal yang diperlukan oleh metode yang mendasarinya adalah 0, panjang array args yang disediakan bisa 0 atau null.
Copy kode kodenya sebagai berikut:
Kelas c = Kelas.forName("com.clazz.reflect.Student");
Objek obj = c.newInstance(); //Buat objek Sutdent.
Metode msetName = c.getMethod("setName", String.class);//obj tidak perlu mengonversi tipe
msetName.invoke(obj, "zhangsan");//Panggil metode setName dan berikan parameter.
Metode msetId = c.getMethod("setId", int.class);
msetId.invoke(obj, 409090202);
Sistem.keluar.println(obj);
Contoh penerapan refleksi Kelas entitas
Copy kode kodenya sebagai berikut:
paket org.dennisit.reflect.entity;
import java.io.Serializable;
/**
*
*Pengguna.java
*
* @versi: 1.1
*
* @penulis: Su Ruonian<a href="mailto:
[email protected]">Kirim email</a>
*
* @sejak: 1.0 Waktu pembuatan: 26-2-2013 13:43:56
*
* TODO: kelas User.java digunakan untuk ...
*
*/
Pengguna kelas publik mengimplementasikan Serializable{
tes String pribadi;
eksekusi public void(Nama string,int umur){
System.out.println("nama=" + nama + ",umur=" + umur);
}
}
Kelas tes refleksi
Copy kode kodenya sebagai berikut:
paket org.dennisit.reflect.main;
import java.lang.reflect.Field;
/**
*
* ReflectEx.java
*
* @versi: 1.1
*
* @penulis: Su Ruonian<a href="mailto:
[email protected]">Kirim email</a>
*
* @sejak: 1.0 Waktu pembuatan: 26-2-2013 13:46:00
*
* TODO: kelas ReflectEx.java digunakan untuk ...
*
*/
kelas publik ReflectEx {
public static void main(String[] args)melemparkan Pengecualian {
Kelas cls = Kelas.forName("org.dennisit.reflect.entity.User");
Obj objek = cls.newInstance(); //Buat objek Pengguna
Bidang f = cls.getDeclaredField("test"); //Dapatkan atribut tes
f.setAccessible(true); //Membuka izin akses untuk pengujian atribut pribadi
f.set(obj, "zhangsan"); //Salin lagi untuk pengujian
System.out.println(f.get(obj)); //Dapatkan nilai atribut pengujian dari obj
//Dapatkan metode berdasarkan nama metode yang dijalankan
java.lang.reflect.Method m = cls.getMethod("eksekusi", String.class, int.class);
m.invoke(obj, "dennisit",23); //Panggil metode eksekusi
}
}
Efek operasi
Copy kode kodenya sebagai berikut:
zhangsan
nama=dennisit,umur=23
Contoh penulisan kelas instantiasi dinamis reflektif
Copy kode kodenya sebagai berikut:
paket org.dennisit.reflect.main;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
impor java.util.Set;
/**
*
* DynamicReflect.java
*
* @versi: 1.1
*
* @penulis: Su Ruonian<a href="mailto:
[email protected]">Kirim email</a>
*
* @sejak: 1.0 Waktu pembuatan: 26-2-2013 13:58:12 siang
*
* TODO: Contoh instantiasi dinamis menggunakan refleksi
*
*/
kelas publik DynamicReflect {
getInstance Objek statis publik(String className,Map<String,Object> map)melemparkan Pengecualian{
Kelas c = Kelas.forName(className);
Objek objek = c.newInstance(); //Objek objek
Set<String> key = map.keySet(); //Dapatkan semua atribut yang sesuai
Field[] fAll = c.getDeclaredFields(); //Dapatkan semua properti di kelas
for(int i=0;i<fAll.length;i++){
for(String key:keys){ //Pencocokan loop
if(fAll[i].getName().equals(key)){ //Jika atribut yang diteruskan oleh pengguna cocok dengan nama atribut di kelas yang diperoleh
Bidang f = c.getDeclaredField(key);//Dapatkan atribut ini
//Bangun nama metode setxxx()
String methodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Metode metode = c.getMethod(methodName, f.getType());//Dapatkan metode yang sesuai berdasarkan nama pengguna yang dibuat
metode.invoke(obj, map.get(key));//Panggilan metode
}kalau tidak{
melanjutkan;
}
}
}
mengembalikan objek;
}
}
Selanjutnya kita menguji contoh instantiasi refleksi dinamis yang kita tulis
Kelas entitas
Copy kode kodenya sebagai berikut:
paket org.dennisit.reflect.entity;
import java.io.Serializable;
/**
*
*Pengguna.java
*
* @versi: 1.1
*
* @penulis: Su Ruonian<a href="mailto:
[email protected]">Kirim email</a>
*
* @sejak: 1.0 Waktu pembuatan: 26-2-2013 13:43:56
*
* TODO: Kelas entitas
*
*/
Pengguna kelas publik mengimplementasikan Serializable{
nama String pribadi;
usia swasta;
email String pribadi;
public User() {//Tidak boleh memiliki konstruktor parameter
}
//pengambil() dan penyetel()
}
Kelas ujian utama
Copy kode kodenya sebagai berikut:
paket org.dennisit.reflect.main;
impor java.util.HashMap;
import java.util.Map;
import org.dennisit.reflect.entity.User;
/**
*
* ReflectEx.java
*
* @versi: 1.1
*
* @penulis: Su Ruonian<a href="mailto:
[email protected]">Kirim email</a>
*
* @sejak: 1.0 Waktu pembuatan: 26-2-2013 13:46:00
*
* TODO: kelas ReflectEx.java digunakan untuk ...
*
*/
kelas publik ReflectEx {
public static void main(String[] args)melemparkan Pengecualian {
Kelas cls = Kelas.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Peta<String,Objek> peta = HashMap<String, Objek>();
map.put("nama", "dennisit");
peta.put("usia", 22);
map.put("email", "[email protected]");
Pengguna pengguna = (Pengguna)DynamicReflect.getInstance(namakelas, peta);
System.out.println(pengguna.getName() + "," + pengguna.getAge() + "," + pengguna.getEmail());
}
}
Hasil program berjalan
Copy kode kodenya sebagai berikut: