一、 反射概述
1.1 反射机制定义
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.2 反射机制的功能
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时调用任意一个对象的方法。
- 生成动态代理。
二、 通过Java反射查看类信息
2.1 获得Class对象
每个类被加载之后,系统就会为该类生成一个对应的Class对象。通过该Class对象就可以访问到JVM中的这个类。
获取方式:
- 使用Class类的forName(String clazzName)静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定名(必须添加完整包名)。
|
|
- 调用某个类的class属性来获取该类对应的Class对象。
|
|
- 调用某个对象的getClass()方法。
|
|
2.2 获取class对象的属性、方法、构造函数等
- 获取class对象的成员变量
|
|
- 获取class对象的方法
|
|
- 获取class对象的构造函数
|
|
- 其他方法
|
|
三、通过Java反射生成并操作对象
3.1 生成类的实例对象
- 使用Class对象的newInstance()方法来创建该Class对象对应类的实例。这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法时实际上是利用默认构造器来创建该类的实例。
|
|
- 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用指定的构造器来创建实例。
|
|
3.2 调用类的方法
调用Method对象中的 Object invoke(Object obj, Object… args) 方法。第一个参数对应调用该方法的实例对象,第二个参数对应该方法的参数。
|
|
要调用某个对象的private方法,则要先调用Method对象的setAccessible(boolean flag)
方法。值为true,指示该Method在使用时应该取消Java语言的访问权限检查;false要实施Java语言的访问权限检查
3.3 访问成员变量值
读取成员变量值
基本变量:getXXX(Object obj) 获取obj对象的该成员变量的值,XXX对应8种基本类型。
引用类型:get(Object obj)
设置成员变量值
基本变量:setXXX(Object obj, XXX val) 设置obj对象的该成员变量的值,XXX对应8种基本类型。
引用类型:setXXX(Object obj, Object val)
12345678//生成新的对象:用newInstance()方法Object obj = class1.newInstance();//获取age成员变量Field field = class1.getField("age");//将obj对象的age的值设置为10field.setInt(obj, 10);//获取obj对象的age的值field.getInt(obj);