目录
反射:框架设计的灵魂
反射机制:将类(Class<T>)的各个组成部分(域(Field),构造方法(Constructor<T>),方法(Method))封装为其他对象
功能:
- 在运行时分析类的能力;
- 在运行时查看对象;
- 实现通用的数组操作代码;
- 可以解耦;
为了方便理解,我们先看一下Java程序运行的三个阶段:
第一个阶段:源码阶段,源码通常保存在硬盘上,所以第一阶段就是从硬盘上读取字节码。
第二个阶段:内存阶段,要知道一个程序运行,并非是直接在硬盘上运行的(否则要内存条何用),而是在内存里运行的。所以第二个阶段就是通过类加载器从硬盘上把类加载到内存里。
第三个阶段:运行阶段,这个阶段才是我们所熟悉的运行阶段。对象的创建以及方法的执行就是在这个阶段(如何运行的就要去看计算机的操作系统原理了)
而类的三种获取方法也对应这三个不同的阶段。
1、类的三种获取方式
(1)、Class.forName("全类名")
(2)、类名.class
(3)、对象.getClass()
方式 | 阶段 | 异同 |
---|---|---|
Class.forName("全类名") | 源码阶段 | 将字节码文件加载进内存(源码阶段),返回Class对象,全类名通常定义在配置文件中,便于利反射机制生成类对象,加载类。 这个方法只有在forName是类名或者接口名才能使用,否则将抛出一个chekedException。所以无论什么时候,使用forName时都应该提供一个异常处理器 |
类名.class | 内存阶段 | 类加载进内存后从类名获取(内存阶段) 想想为什么是.class而不是.class()? 通常 类名.属性 代表什么?类的静态属性,直接通过类名调用 |