前言
我们为什么要学反射呢?因为反射是框架设计得灵魂。那么框架又是什么呢?框架是半成品软件,可以在框架的基础上进行软件开发,简化编码。
一、反射
概念:将类得各个组成部分封装为其他对象,这就是反射机制。
本质:得到类的class对象后,反向获取对象的各种信息。
好处:1.可以在程序运行过程中,操纵这些对象。2.可以解耦,提高程序的可扩展性。
如图通过反射在运行时阶段获取字节码对象,通过字节码对象获取对象的方法,从而执行方法
二、获取Class对象的三种方式
1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象。(这种方式多用于配置文件,将类名定义在配置文件中。读取文件,加载类。)
2.类名.class:通过类名的属性class获取,返回Class对象。(这种方式多用于参数的传递。)
3.对象.getClass():getClass()方法在Object类定义着,对过对象的getClass(),返回Class对象。(这种方式多用于对象的获取字节码的方式。)
三、Class对象的获取功能
1.获取成员变量们
* Field[] getFields() :获得某个类的所有的公共(public)的字段,包括父类中的字段。
* Field getField(String name) :根据字段名获得某个类的所有的公共(public)的字段,包括父类中的字段。
* Field[] getDeclaredFields() :获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
* Field getDeclaredField(String name) :根据字段名获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
2.获取构造方法们
* Constructor<?>[] getConstructors() :获得某个类的所有的公共(public)的构造器。
* Constructor<T> getConstructor(类<?>... parameterTypes) : 根据形参列表,获得某个类的所有的公共(public)的构造器。
* Constructor<?> getDeclaredConstructors() :获得某个类的所有声明的构造方法,即包括public、private和proteced。
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) :根据形参列表获得某个类的所有声明的构造方法,即包括public、private和proteced。
3.获取成员方法们:
* Method[] getMethods() :获得某个类的所有声明的公共(public)的方法。
* Method getMethod(String name, 类<?>... parameterTypes):根据方法名和形参列表, 获得某个类的所有声明的公共(public)的方法。
4.获取类名:
* String getName()
四、应用场景之写一个框架,在不改变任意类的情况下,可以帮我们创建任意类的对象,并且执行其中任意方法。
* 实现:
1.配置文件
2.反射
* 步骤:
1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2.在程序中加载读取配置文件
3.使用反射技术来加载文件进内存
4.创建对象
5.执行方法
首先创建配置文件,用于配置类名与执行的方法名
然后创建用于验证的学生类与个人类以及简单的框架反射类
其次再不改变代码的情况下,仅仅改变配置文件的className与methodName,从而达到执行指定类的方法