java反射机制
编写一个工厂方法可以根据配置文件产任意类型的对象。 例如有配置文件stu.properties,存储在项目的src文件夹下,内容如下:
class=com.itheima.reflect.Student
name=rose
gender=女
age=18
根据配置文件信息创建一个学生对象
什么是反射
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法,属性,构造方法等成员。
反射在实际开发中的应用
以上的IDE内部都大量使用了反射机制,我们在使用这些IDE写代码也无时无刻的使用着反射机制,一个常用 反射机制的地方就是当我们通过对象调用方法或访问属性时,开发工具都会以列表的形式显示出该对象所有 的方法或属性,以供方便我们选择使用,如下图:
这些开发工具之所有能够把该对象的方法和属性展示出来就使用利用了反射机制对该对象所有类进行了解剖 获取到了类中的所有方法和属性信息,这是反射在IDE中的一个使用场景。
各种框架的设计
以上三个图标上面的名字就是Java的三大框架,简称SSH.
这三大框架的内部实现也大量使用到了反射机制,所有要想学好这些框架,则必须要求对反射机制熟练了
使用反射机制解剖类的前提
必须先要获取到该类的字节码文件对象,即Class类型对象。关于Class描述字节码文件如下图所示:
说明:
1)Java中使用Class类表示某个class文件.
2)任何一个class文件都是Class这个类的一个实例对象.
获取Class对象的三种方式
方式1:通过类名.class获取
方式2:通过Object类的成员方法getClass()方法获取
方式3:通过Class.forName("全限定类名")方法获取
获取Class对象的信息
知道怎么获取Class对象之后,接下来就介绍几个Class类中常用的方法了。
获取简单类名
获取完整类名
创建对象
获取Class对象的Constructor信息
一开始在阐述反射概念的时候,我们说到利用反射可以在程序运行过程中对类进行解剖并操作里面的成员。而一般 常操作的成员有构造方法,成员方法,成员变量等等,那么接下来就来看看怎么利用反射来操作这些成员以及操作 这些成员能干什么,先来看看怎么操作构造方法。而要通过反射操作类的构造方法,我们需要先知道一个 Constructor类。
Constructor类概述
Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过Constructor对象可以实例化对 象。
Class类中与Constructor相关方法
Constructor类中常用方法
获取Class对象的Method信息
操作完构造方法之后,就来看看反射怎么操作成员方法了。同样的在操作成员方法之前我们需要学习一个类: Method类。
Method类概述
Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以调用方法。
Class类中与Method相关方法
Method类中常用方法
示例
获取Class对象的Field信息
Field类概述
Field是属性类,类中的每一个属性(成员变量)都是Field的对象,通过Field对象可以给对应的成员变量赋值和取 值。
Class类中与Field相关方法
Field类中常用方法
setXxx方法都是给对象obj的属性设置使用,针对不同的类型选取不同的方法。
getXxx方法是获取对象obj对应的属性值的,针对不同的类型选取不同的方法。
反射案例
案例说明
编写一个工厂方法可以根据配置文件产任意类型的对象。
例如有配置文件stu.properties,存储在项目的src文件夹下,内容如下:
class=com.itheima.reflect.Student name=rose gender=女 age=18
根据配置文件信息创建一个学生对象
实现步骤分析
1. 在项目src文件中新建一个包:com.itheima.reflect,并在该包下创建Student类。
2. Student类的属性:String name,String gender,int age
3. 定义一个工厂方法:createObject(),方法返回值类型为:Object
4. 创建Properties集合并读取stu.properties文件中的内容到集合中。
5. 根据class获得学生类全名,并通过反射技术获得Class对象。
6. 通过调用Class对象的方法创建学生对象。
7. 遍历Properties集合,利用反射技术给学生成员变量赋值。
8. 返回封装好数据的学生对象。
总结
Spring框架中就会有大量根据配置文件 信息创建对象的过程,其内部的原理和我们这个案例的原理是一样,有这个案例做基础,以后学到spring框架时就 会容易理解了