Java 反射机制核心逻辑与面试考点
核心知识体系
1. 反射的核心概念
反射是 Java 的动态机制,允许在运行时分析类、执行类中方法。其核心是 java.lang.Class 类:
- 类加载后,JVM 在堆内存中创建一个
Class对象(一个类只有一个Class对象),存储类的完整结构信息(属性、方法、构造器等)。 - 反射通过
Class对象获取这些元数据,从而突破封装性(如访问私有成员)。
2. 获取 Class 实例的四种方式(重点)
获取 Class 对象是反射的起点,四种方式各有适用场景:
- 类名.class:编译期间已知,最安全、性能最高(如
String.class); - 对象.getClass():需先有对象(如
"hello".getClass()); - Class.forName("全类名"):最常用,支持动态加载(如 JDBC 驱动加载,会执行类的初始化);
- ClassLoader.loadClass():仅加载类,不执行初始化(适合框架动态加载,避免不必要的初始化)。
3. 类的加载过程(重点)
类的加载分为三阶段,理解这三阶段是掌握反射和类加载器的关键:
- 加载(Loading):将
.class文件读入内存,创建Class对象; - 链接(Linking):验证(确保
.class合法)、准备(静态变量赋默认值)、解析(符号引用→直接引用); - 初始化(Initialization):执行静态代码块(
static{}),初始化静态变量。 双亲委派机制:子加载器先委托父加载器加载,避免重复加载(如java.lang.String由 Bootstrap 加载,防止被篡改)。
4. 反射的三大应用(重点)
反射的核心是'操作类内部结构',三大应用场景如下:
创建运行时类的对象
clazz.newInstance():调用无参构造器(已过时,推荐用Constructor);constructor.newInstance(...):调用指定构造器(需处理异常,如InstantiationException)。
获取/操作属性(Field)
getDeclaredField(name):获取本类属性(包括私有);setAccessible(true):暴力反射,强行访问私有属性;set(obj, value)/get(obj):读写属性值(需setAccessible(true)突破私有)。
调用方法(Method)
getDeclaredMethod(name, paramTypes):获取本类方法(包括私有);method.invoke(obj, args):执行方法(反射最核心的代码,需setAccessible(true)突破私有)。


