Java反射机制是主流框架运行逻辑的基石,支撑IOC容器的对象创建与依赖注入、ORM框架的数据库映射、AOP动态代理等核心功能,实现配置驱动与运行时动态装配。

Java 反射机制在主流框架中不是“辅助功能”,而是整个运行逻辑的基石。它让框架摆脱了硬编码依赖,实现了真正的配置驱动和动态装配。
反射是框架实现“运行时决策”的唯一路径
Spring、MyBatis、Hibernate 这些框架在启动时根本不知道你的业务类长什么样。它们只读取配置(XML/注解/properties)或扫描包路径,拿到的是字符串形式的类名,比如 "com.example.UserServiceImpl"。没有反射,就无法把这串字符变成真实对象——Class.forName() 加载类,Constructor.newInstance() 创建实例,Field.set() 注入属性,Method.invoke() 调用方法,每一步都依赖反射完成。
IOC 容器靠反射完成对象生命周期管理
Spring 的 Bean 创建过程本质是一连串反射调用:
- 解析 @Component 或
得到类全名 - 用 Class.forName() 加载该类,触发类加载与静态初始化
- 获取无参或带参构造器,用反射创建原始实例
- 遍历所有 @Autowired 字段,通过 Field.set() 注入依赖对象
- 调用 @PostConstruct 方法,靠 Method.invoke() 执行
ORM 框架靠反射打通数据库与 Java 对象
MyBatis 执行一条 select * from user 后,得到 ResultSet 中的列名和值。它并不提前知道你要映射成 User 还是 Admin,而是:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 根据 resultType 或 resultMap 中配置的目标类名,反射获取 Class 对象
- 遍历该类所有 public 或 private 字段(用 getDeclaredFields() + setAccessible(true))
- 按字段名匹配列名,用 Field.set() 把数据库值赋给对象属性
- 整个过程不写一行 new User(),也不手动写 user.setId(rs.getLong("id"))
动态代理与 AOP 的底层支撑
Spring AOP 生成代理对象时,无论是 JDK 动态代理还是 CGLIB,初始阶段都离不开反射:
- JDK 代理:Proxy.newProxyInstance() 内部会反射获取被代理接口的方法列表
- CGLIB:生成子类字节码前,需反射读取目标类的方法签名与访问修饰符
- 拦截方法调用时,InvocationHandler 中的 invoke() 方法接收 Method 对象,再用 method.invoke(target, args) 实际执行原逻辑
没有反射,框架就退化成一堆需要手动 new、手动 set、手动调用的模板代码。反射赋予了 Java 框架“看懂类结构”和“按需操作”的能力,这才是它不可替代的核心地位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










