反射允许对封装类的字段(成员变量),成员方法和构造方法的信息进行编程访问。
- 获取修饰符、名字、获取类型、赋值/获取值(创建对象)
- 获取返回值、抛出的异常、获取注解、运行方法
从class字节码文件获取对象。
反射机制
- 反射机制允许程序在执行期借助于**reflection API取得任何类的内部信息**(比如成员变量,构造器,成员方法等),并能操作对象的属性及方法。(反射在设计模式和框架底层会用到)
- 加载完类之后,**在堆中就产生了一个class类型的对象(一个类只有一个class对象),这个对象包含了类的完整结构信息**,通过这个对象得到类的结构,这个对象就像一面镜子,透过这个镜子看到类的结构,这个对象称为反射。
class类
- class也是类,因此集成object对象。
- class类是通过类加载器ClassLoader系统创建的。
- 对于某个类的class类对象,在内存中只有一份,因为类值加载一次。
- 每个类的实例都会记得自己是由那个class实例锁生成。
- 通过class可以完整的得到一个类的完整结构。
- class对象是存放在堆的。
- 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据。
反射方法
获取class对象的三种方法
- Class.forName("全类名") 源代码阶段 (最为常用)
- 类名.class 加载阶段 (作为参数传递)
- 对象.getClass() 运行阶段 (当已经有了这个类的对象时,才可以使用)
反射获取构造方法
getConstructors:返回所有公共构造方法对象的数组
getDeclaredConstructors:返回所有构造方法对象的数组
getConstructor:返回单个公共构造方法对象的数组
getDeclaredConstructor:返回单个构造方法对象的数组
反射获取成员变量
getFields,getDeclaredFields、getField,getDeclaredField:同上