Java中的反射机制(个人学习笔记)

什么是反射?

  • 反射:能够获取并分析类信息的能力叫做反射。
  • 类信息包括:属性(Field)方法(Method)构造器(Constructor)

获取类信息的三种方式:

方式备注
通过==Class.forName(“完整的类名带包名”)==获取通过路径获取,多用于配置文件,将类名定义在配置文件中,读取文件加载类
通过==类对象.getClass()==获取多用于使用对象来获取对象信息
通过类.class获取多用于类作为参数传递的情况
  • 示例代码:
public static void main(String[] args) throws ClassNotFoundException {
	//反射获取Class对象
	Class cla = Class.forName("com.test.Person");
	Field[] fields = cla.getFields(); //获取类中的全部信息
	
	Class cla1 = Person.class;
	
	Person p = new Person();
	Class cla2 = p.getClass();
	
	//同一个类在一次程序运行时只会被加载一次,因此三种方式获得的类对象是同一个
}
  • **类信息.get…**方法可以获取到public修饰的方法和成员变量,**类信息.getDeclare…**方法可以获取到任意方法和成员变量
  • setAccessible(true):非公共成员变量如果想有效使用需要设置忽略安全访问修饰符的安全检查(简称暴力反射)

获取构造方法

获取指定的构造方法

  1. 获取类信息:Class.forName(),返回类型为Class
  2. 获取构造方法对象:类信息.getConstructor(),返回类型为Constructor类型。
  3. 获取类对象:类信息.newInstance()(反射之后通过newInstance方法拿到类对象),返回类型为Object类型。
//获取类信息
Class cla = Class.forName("com.test.Person");

//获取无参数的构造方法对象
Constructor constructor = cla.getConstructor();
//获取有参数的构造方法对象(可以根据构造方法参数类型的不同,传入对应类型的对象,即可获取指定构造方法。)
Constructor constructor = cla.getConstructor(String.class, int.class);

//获取类对象
Object object = constructor.newInstance(); //根据获取到的构造方法判断是否传递参数

//如果使用无参构造方法,可以直接通过类信息cla.newInstance()实现new对象

获取所有的构造方法

Constructor[] constructors = cla.getConstructors();
for (Constructor cons : constructors) {
	System.out.println(cons); //输出所有的构造方法
}

获取成员变量

获取指定成员变量

  1. 获取类信息:Class.forName(),返回类型为Class
  2. 获取成员变量对象:类信息.getField(),返回类型为Field类型。
  3. 设置值set(Object obj, Object value),获取值get(Object obj)
//获取类信息
Class cla = Class.forName("com.test.Person");

//获取成员变量对象(只能是公共成员变量)
Field field = cla.getField("name");
//获取所有成员变量(无论该变量是公有私有都可以获取到)
Field fieldAll = cla.getDeclareField("age");

Person p = new Person();
//设置或访问成员变量值(给p对象的name属性赋值为“张三”)
field.set(p, "张三");
field.get(p);
//如果想要对私有变量age进行修改,需要设置忽略安全访问修饰符的安全检查(简称暴力反射)
fieldAll.setAccessible(true);
fieldAll.set(p, 18); 

获取所有成员变量

Field[] fields = cla.getFields(); //这里getFields只能够获取公共的成员变量(public)
for (Field f : fields) {
	System.out.println(f); //输出所有的公共成员变量
}
Field[] fields = cla.getDeclareFields(); //获取所有的成员变量,无论私有还是公有
for (Field f : fields) {
	System.out.println(f); //输出所有的成员变量
}

方法使用

获取指定方法对象

  1. 获取类信息:Class.forName(),返回类型为Class
  2. 获取指定方法对象:类信息.getMethod()getDeclareMethod(),区别同上,根据方法名以及参数类型入参对应类对象可以指定获取,返回类型为Method
  3. 调用方法:invoke(Object obj, Object... args)。第一个入参为调用方法的对象,后面的可变参数为方法调用需要传入的参数。

获取所有方法对象

  • getMethods()getDeclareMethods()用法同上。
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值