反射技术

本文深入讲解Java反射技术的基础概念及应用场景,介绍如何通过三种不同方式获取Class对象,并演示利用反射创建对象的过程。此外,还详细解释了如何通过反射访问类中的字段,包括私有字段。

1、反射技术是动态获取指定类以及类中的内容(成员),并运行其内容

      应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象,这时就可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,创建该类的对象实例。这就需要使用反射技术完成。

2、获取class(字节码)对象的三种方式

方式一:

通过对象具备的getClass方法(源于Object类的方法),需要用到该类,并创建该类的对象,再调用getClass方法完成。

//创建Person对象
Person p=new Person();
//通过Object继承来的方法(getClass)获取Person对应的字节码文件对象
Class clazz=p.getClass();

方式二:

每一个类型都具备一个class静态属性,通过该属性即可获取该类的字节码文件对象。用一个静态属性可以搞定,但是必须使用该类。

Class clazz=Person.class

方式三:

寻找Class类中是否有提供获取的方法,可以找到static Class forName(className)

相对方便,不需要直接使用具体的类,只要知道该类的名字即可,而名字可以作为参数进行传递,这样可以提高扩展性。

Class clazz=Class.forName("com.mytest.Person");

3、创建Person对象的方式

①以前:

//先加载com.mytest.Person类进内存
//将该类封装成Class对象
//根据Class对象,用new操作符创建com.mytest.Person对象
//调用构造函数对该对象进行初始化
com.mytest.Person p=new com.mytest.Person();

②通过方式三:(根据名称获取其对应的字节码对象)

String className="com.mytest.Person";
//通过forName()根据指定的类名称去查找对应的字节码文件,并加载进内存
//并将该字节码文件封装成了Class对象
//直接通过newInstance方法,完成该对象的创建
//newInstance方法调用该类中的空参构造函数完成对象的初始化
Class clazz=Class.forName(className);

4、获取字节码文件中的字段

Class clazz=Class.forName("com.mytest.Person");
//获取该类中的指定字段,比如age
Field field=clazz.getDeclaredField("age");
//为了对该字段进行操作,必须要先有指定类的对象
Object obj=clazz.newInstance();
//对私有访问,必须取消对其的访问控制检查
//使用AccesibleObject父类中的setAccessible方法
//暴力访问私有,建议尽量不要访问私有
field.setAccessible(true);
field.set(obj,789);
//获取该字段的值
Object o=field.get(obj);
System.out.println(o);

getDeclaredField:获取所有属性,包括私有。

getField:获取公开属性,包括从父类继承过来的。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值