简单来说,Java 反射机制就是 Java 运行时通过创建一个类的反射对象,再对类进行相关操作:
- 获取对象的成员变量、赋值
- 调用该对象的方法(构造方法、有参/无参)
- 判断该对象所属类
反射的原理
Java 编译后生成 .class 文件,JVM 启动时会载入所有的 .class 文件,并将Class 信息存储在方法区中。
对象都分配在 Java 堆上,但是对象头还是会保存类型指针指向方法区的这个类信息。
所以,与正射不同,反射我们首先在方法区获得这个类型信息,这样就能知道这个类的父类、构造器、属性、方法、注解等信息,我们就能利用这些类型信息完成对实例的操作。这就是使用一个类的逆向过程。
操作比较
三种获取 Class 的方式及区别:
- MyClass.class : 被 ClassLoader 加载到内存中,不会做任何类的初始化工作
- Class.forName: 被 ClassLoader 加载到内存中,会进行类的静态初始化工作
- new MyClass().getClass: 被 ClassLoader 加载到内存中,静态初始化和非静态初始化工作都会进行