我们如果没有学过反射和注解,就直接在spring里面用注解,这时候你可能会一知半解,只知道怎么使用注解,而不是这个注解为啥会有这个作用,接下来讲的内容,先介绍反射,再介绍注解
反射–框架设计的灵魂
* 框架:半成品软件,可以在框架的基础上进行软件开发
* 反射:将类的各个组成部分封装成对象,这就是反射机制*
java代码在计算机中经历的3个阶段
- Source源代码阶段
- Class类对象阶段
- Runtime运行阶段
Source源代码阶段
source源代码阶段就是写好的java代码编译成class文件的过程
Java代码中我们常见的创建对象,就是通过new 的方法,这其实是第三个阶段,即Runtime运行阶段
但是对象怎么能这么轻易的就创建出来呢?天下间怎么会有这样简单的事情,中间肯定还经历了好多事情,没错,就是第二个阶段,Class类对象阶段
而这里反射机制就出来了,class文件通过类加载器加载到内存,而这里发射机制就出来了,反射就是讲类的各个组成部分变成对象这样一个过程,上图中反射的成员变量,成员方法,构造方法通过反射机制,全部都变为了对象,有多少个成员变量,就有多少个成员变量对象,有多少个成员方法,就有多少个成员方法对象,都在数组中,Field[] fields数组,里面就是成员变量的对象的数组
反射获取字节码Class对象的三种方式
1、Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
2、类名.class 通过类名的属性class获取
3、对象.getClass() getClass()方法在object类中定义着
这三种方式获取的Class类对象都是同一个,只是从.class文件到Class对象的方式有三种,为什么要有三种方式呢?为什么平白无故会有三种呢?
因为每种方式都有每种方式的特点
Class对象的功能(重要知识点)
在反射面前没有什么私有,共有的,共有的是我的,私有的也是我的
通过getDeclaredFields方法可以获取到所有的成员变量对象,无论是私有的还是共有的
但是但是但是,仅仅是获取成员变量对象,如果还想进一步通过这个成员变量对象操作这个对象的成员变量属性,那还是不行的,会报错,如下
这时需要加上一条关键语句
对象.setAccessible(true)
构造方法
如果是空参构造,可以直接用类名调用newInstance()方法
获取成员方法,还是一样的套路
重点来了,反射有啥用呢?整这么多知识点,到底有啥用呢?
我们来写一个框架,可以帮助我们创建任意类的对象,并且执行其中的任意方法
这样通过改配置文件的方法来改变调用的方法,或调用的类 VS 直接改两行代码
问:这两者哪个好一些?
答: 那肯定是改配置文件啊,改配置文件多方便啊,直接改!!!要是改代码,那你改完之后,还得安排人进行测试,查看代码改的是否正确,这多麻烦啊!!!
好了,反射已全部讲解完成!!!!!!