Rumah > Java > javaTutorial > teks badan

Contoh Analisis Prinsip Mekanisme Refleksi Java

WBOY
Lepaskan: 2023-05-19 21:13:04
ke hadapan
988 orang telah melayarinya

Apakah refleksi?

Mekanisme pantulan berada dalam keadaan berjalan Ia menyediakan Java dengan keupayaan untuk "menjalankan objek". dipanggil. Kaedah, termasuk yang peribadi, adalah telus kepada semua kelas di hadapan mekanisme pantulan

Ringkasan saya sendiri: Segala-galanya dalam kelas ini boleh dilihat melalui objek fail Kelas, dan boleh digunakan dan diubah suai

Contoh Analisis Prinsip Mekanisme Refleksi Java

Premis pantulan adalah untuk mendapatkan objek fail Kelas ((objek bytecode)), maka terdapat tiga cara untuk mendapatkannya:

  • Class.forName ("nama kelas penuh") ---- melalui kaedah statik kelas Kelas (paling biasa digunakan)

  • nama kelas.kelas

  • objek .getClass()

//方式1:获取字节码对象,Class.forName("全类名")
Class cla1 = Class.forName("Study01.Person");

//方式2: 类名.Class
Class cla2 = Person.class;

//方式3:对象.getClass();
Person per = new Person();
Class cla3 = per.getClass();

//这三个class对象都是由Person这个类生成的
//那么我们看一下这三个字节码对象是不是同一个:

System.out.println(cla1==cla2);
System.out.println(cla2==cla3);
Salin selepas log masuk

//Hasil keluaran: Dua benar

Kesimpulan:

  • Objek bytecode dijana apabila kelas dimuatkan dan hanya ada satu

  • Tidak kira cara untuk mendapatkan objek bytecode, ia adalah sama objek bytecode

Dapatkan atribut dalam kelas melalui refleksi:

Selepas mendapat objek bytecode Kelas, kita boleh mendapatkan atribut kelas yang ingin kita lalui objek bytecode , kaedah, kaedah pembinaan dan pengubahsuaian peribadi

Beberapa kaedah Kelas:

Contoh Analisis Prinsip Mekanisme Refleksi Java

Demo:

1. Kelas, yang mempunyai dua atribut awam dan dua peribadi (tiada pembinaan dan dapatkan/set, cuma lihat jika pantulan boleh mendapatkan nilai di dalam)

public class Person {

    private String name;  //名字
    private int age = 18;   //年龄

    public int ID = 123;   //身份证
    public String Sex;  //性别

    @Override
    public String toString(){
        return "姓名"+name+"年龄:"+age+"ID:"+ID+"性别:"+Sex;
    }
}
Salin selepas log masuk

Kelas ujian:

public class Test {

    public static void main(String[] args) throws ClassNotFoundException {

		//获取Class文件对象,用最常用的通过Class类的静态方法
        Class per = Class.forName("Test01.Person"); //这里是传入全路径!!从最外层的包名开始!
        //使用getFields()方法获取全部被public修饰的属性(方法上面的截图有)
        //并且返回的是Field类型的数组
        Field fields[] = per.getFields();
        for (Field field:fields) {
            System.out.println(field);
        }
    }
}
Salin selepas log masuk

Output :

Kami berjaya memperoleh semua atribut awam dalam kelas Orang

Contoh Analisis Prinsip Mekanisme Refleksi Java

2 Anda juga boleh mendapatkan semua atribut, termasuk yang peribadi: (Kod lain adalah Tiada penulisan semula)

 for (Field field : per.getDeclaredFields()) {
            System.out.println(field);
        }
Salin selepas log masuk

Output:

Contoh Analisis Prinsip Mekanisme Refleksi Java

3. Dapatkan atribut awam dan ubah suai nilai:

	
	Field f = per.getField("Sex");
	System.out.println(f);
	
	//获取一个对象:
	Object obj = per.getConstructor().newInstance();
	//修改值:
	f.set(obj,"男");
	Person p = (Person)obj;
	
	System.out.println(p.Sex);
Salin selepas log masuk

Output:

Contoh Analisis Prinsip Mekanisme Refleksi Java

4. Dapatkan atribut peribadi dan ubah suai nilai: Di ​​sini, sambungkan nilai atribut awam yang diubah suai di atas:

   
        Person p = (Person)obj;
        
        //获取公有字段并调用,并修改
        Field f = per.getField("Sex");
        //获取一个对象:
        Object obj = per.getConstructor().newInstance();
        f.set(obj,"男");  //将Sex的属性修改成了 男

        //调用私有的属性,并修改
        f = per.getDeclaredField("name");
        //在访问私有的属性的值之前,先要设置运行访问↓
        //在访问之前忽略访问权限的检查,叫暴力反射
        f.setAccessible(true);
        f.set(obj,"张三");
        System.out.println("Person里面的信息是:"+p.toString());
    }
}
Salin selepas log masuk

Output:

Contoh Analisis Prinsip Mekanisme Refleksi Java

Dapatkan kaedah (awam, persendirian, pembina) dalam kelas melalui refleksi:

Kelas orang:

public class Person {

    private String name;  //名字
    private int age = 18;   //年龄
    public int ID = 123;   //身份证
    public String Sex ;  //性别
    
    //构造:
    public Person() {}

    public Person(String name, int age, int ID, String sex) {
        this.name = name;
        this.age = age;
        this.ID = ID;
        Sex = sex;
    }
    
    //无参公有方法:
    public void eat(){
        System.out.println("我会吃饭");
    }
    
    //有参公有方法:
    public void eat(String food){
        System.out.println("我在吃:"+food);
    }
    
    //有参私有方法
    private void  play(String name){
        System.out.println(name+"在玩");
    }
}
Salin selepas log masuk

Kelas ujian:

public class Test {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        //获取到Person以及父类Object里面的public方法:
        System.out.println("-----获取到Person以及父类Object里面的public方法↓-----");
        for (Method method : Person.class.getMethods()) {
            System.out.println(method);
            System.out.println("方法名:"+ method.getName());
        }

        //获取到Person里面的方法,包括私有
        System.out.println("-----获取到Person里面的方法,包括私有↓-----");
        for (Method method:Person.class.getDeclaredMethods()) {
            System.out.println(method.getName()+"  ");
        }

        //按照方法名获取到Person中的eat方法:
        System.out.println("-----根据方法名获取到Person类中的eat方法↓-----");
        Method earMethod1 = Person.class.getMethod("eat");
        Person per = new Person();
        //通过invoke(Object,param...)来调用指定的方法
        earMethod1.invoke(per);

        //使用反射调用有参方法;
        System.out.println("-----使用反射调用有参方法(传入参数)↓-----");
        Method earMethod2 = Person.class.getMethod("eat",String.class);
        earMethod2.invoke(per,"牛肉");

        //通过暴力反射获取到私有的play方法:
        System.out.println("-----通过暴力反射获取到私有的play方法传入参数)↓-----");
        Method earMethod3 = Person.class.getDeclaredMethod("play", String.class);
        //在访问私有的属性的方法之前,先要设置运行访问
        earMethod3.setAccessible(true);
        earMethod3.invoke(per,"小王");

    }
Salin selepas log masuk

Output:

-----Dapatkan kaedah awam dalam Person dan kelas induk Object↓-----
public void Test02.Person.eat(java .lang.String)
Nama kaedah: eat
public void Test02.Person.eat()
Nama kaedah: eat
public final void java.lang.Object.wait() throws java.lang .InterruptedException
Kaedah name: wait
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
Nama kaedah: wait
public final native void java.lang .Object.wait(long ) membuang java.lang.InterruptedException
Nama kaedah: tunggu
public boolean java.lang.Object.equals(java.lang.Object)
Nama kaedah: equals
public java.lang.String java .lang.Object.toString()
Nama kaedah: toString
public native int java.lang.Object.hashCode()
Nama kaedah: hashCode
public final native java .lang.Class java. lang.Object.getClass()
Nama kaedah: getClass
public final native void java.lang.Object.notify()
Nama kaedah: notify
public final native void java.lang.Object. notifyAll()
Nama kaedah: notifyAll

Atas ialah kandungan terperinci Contoh Analisis Prinsip Mekanisme Refleksi Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!