1. Apa itu refleksi?
Kelas memiliki banyak komponen, seperti variabel anggota, metode, konstruktor, dll.
Refleksi adalah memuat kelas dan membedah berbagai komponen kelas.
2. Memuat kelas
Ada kelas kelas di Java yang mewakili bytecode kelas tertentu.
Karena kelas kelas mewakili bytecode kelas tertentu, ia harus memberikan pemuatan kelas tertentu.
Metode bytecode: forname ().
ke dalam memori dan merangkum menggunakan objek kelas.
Dua cara lain untuk mendapatkan objek kelas:
Kelas Name.Class
Objek.getClass ()
Buat kelas orang sederhana terlebih dahulu
Salinan kode adalah sebagai berikut:
kelas publik reflectdemo {
public static void main (string args []) melempar pengecualian
{// 1.
Class clazz = class.forname ("dsa.person");
// 2.
Kelas clazz1 = orang baru (). GetClass ();
// 3.
Classclazz2 = person.class;
}
}
3. Metode Konstruksi Refleksi
Di kelas orang:
Salinan kode adalah sebagai berikut:
/**
*Metode konstruksi
*/
publicPerson () {
System.out.println ("null");
}
PublicPerson (StringName) {
System.out.println (nama);
}
publicPerson (stringName, intpwd) {
System.out.println (name+"+"+pwd);
}
privatePerson (listList) {
System.out.println ("Daftar");
}
Di kelas tes:
Salinan kode adalah sebagai berikut:
// Refleksi PublicPerson ()
@Tes
publicVoidTest1 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (null); // Dapatkan objek konstruktor
Personp = (orang) cr.newinstance (null); // instantiate objek melalui konstruktor
//System.out.println(p.name);
}
// Refleksi PublicPerson (StringName)
@Tes
publicVoidTest2 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (string.class);
Personp = (orang) cr.newinstance ("haha");
System.out.println (p.name);
}
// Refleksi PublicPerson (StringName, INTPWD)
@Tes
PublicVoidTest3 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getConstructor (string.class, int.class);
Personp = (orang) cr.newinstance ("haha", 1);
//System.out.println(p.name);
}
// Refleksi PublicPerson (ListList)
@Tes
publicVoidTest4 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
Constructorcr = clazz.getDeclaredConstructor (list.class);
cr.setAccessible (true); // Brute force retak
Personp = (orang) cr.newinstance (newarraylist ());
System.out.println (p.name);
}
// Cara lain untuk membuat objek hanya berlaku untuk membangun metode tanpa parameter
@Tes
publicVoidTest5 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
Personp = (orang) clazz.newinstance ();
System.out.println (p.name);
}
Ketika metode konstruksi bersifat pribadi, kami akan meretaknya! Lai Lai
4. Metode refleksi konvensional
Di kelas orang:
Salinan kode adalah sebagai berikut:
/**
*metode
*/
publicvoidjf ()
{
}
PublicVoidJF (StringName, IntPWD)
{
}
PublicClass [] JF (StringName, int [] PWD)
{
returnNewClass [] {string.class, int.class};
}
Privatevoidjf (inputStreaminS)
{
System.out.println (IN);
}
publicstaticvoidjf (intnum)
{
System.out.println (num);
}
PublicstaticVoidMain (StringArgs [])
{
System.out.println ("Main !!!");
}
Di kelas tes:
Salinan kode adalah sebagai berikut:
/**
*Metode reflektif
*
*@authortanlvxu
*
*/
publicclassdemo2 {
// Metode kelas refleksi: publicvoidjf ()
@Tes
publicVoidTest1 () ThrowSexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", null);
method.invoke (p, null);
}
// Metode Kelas Refleksi: PublicVoidJF (StringName, IntPWD)
@Tes
publicVoidTest2 () ThrowSexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", string.class, int.class);
Method.invoke (P, "DSA", 30);
}
// Metode Kelas Refleksi: PublicClass [] JF (StringName, int [] PWD)
@Tes
PublicVoidTest3 () ThrowSexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", string.class, int []. Class);
Classcs [] = (class []) method.invoke (p, "aads", newInt [] {1,2,3});
System.out.println (CS [0]);
}
// Metode Kelas Refleksi: PrivatevoidJF (InputStreaminS)
@Tes
publicVoidTest4 () ThrowSexception {
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getDeclaredMethod ("jf", inputStream.class);
method.setAccessible (true);
method.invoke (P, newFileInputStream ("d: //qqclient.txt"));
}
// Metode kelas refleksi: publicstaticvoidjf (intnum)
@Tes
publicVoidTest5 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("jf", int.class);
method.invoke (null, 30);
}
// Metode kelas refleksi: publicstaticvoidm (intnum)
@Tes
publicVoidTest6 () ThrowSexception {
Classclazz = class.forname ("rflectordemo.person");
MethodMethod = clazz.getMethod ("main", string []. Class);
//method.invoke(null ,(Object)NewStringöografi {"ds","das "});
method.invoke (null, newObject [] {newstring [] {"ds", "das"}});
}
5. Bidang Refleksi
Di kelas orang:
Salinan kode adalah sebagai berikut:
/**
*Bidang
*/
publicStringName = "swr";
privateIntPassword = 45;
PrivateStateMintage = 35;
Di kelas tes:
Kode Java
/**
*Bidang kelas reflektif
*@authortanlvxu
*
*/
publicclassdemo3 {
/**
*Bidang refleksi PublicStringName = "swr";
*@Throwsexception
*/
@Tes
PublicVoidTest1 () ThrowsException
{
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getfield ("name");
// Dapatkan nilai bidang
ObjectValue = f.get (p);
// Dapatkan jenis bidang
Classtype = f.getType ();
if (type.equals (string.class)) {
StringName = (string) f.get (p);
System.out.println (nama);
}
// Atur nilai bidang
f.set (p, "dfafa");
System.out.println (p.name);
}
/**
*Bidang Refleksi PrivateIntPassword;
*@Throwsexception
*/
@Tes
PublicVoidTest2 () ThrowsException
{
Personp = newperson ();
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getDeclaredfield ("kata sandi");
f.setAccessible (true);
f.set (p, 36);
System.out.println (f.get (p));
}
/**
*Bidang refleksi PrivatesTatic InTring = 35;
*@Throwsexception
*/
@Tes
PublicVoidTest3 () ThrowsException
{
Classclazz = class.forname ("rflectordemo.person");
Fieldf = clazz.getDeclaredfield ("usia");
f.setAccessible (true);
f.set (null, 24);
System.out.println (f.get (null));
}
Bahkan, tidak peduli metode konstruksi refleksi atau bidang, kita dapat belajar darinya satu per satu!