java-3.反射-动态代理
什么是反射
一种java的基础API,通过实例动态地获取和操作一个类/对象的所有内部信息的能力,甚至可无视 private限制
反射的好处
极大的灵活性、通用性
可以编写“通用代码”,在运行时再动态地决定加载谁、执行谁
反射应用场景
- ⭐框架: Spring、MyBatis 等框架用它来实现 IoC/DI (依赖注入) 和 AOP (动态代理)
- 动态加载: 比如
Class.forName()根据配置文件里的一个类名字符串,在运行时加载该类并创建实例(如 JDBC 驱动)。
反射核心
Class实例:JVM为加载的每个类/接口都创建了一个唯一的 Class对象,它储存了该类型的所有元数据(名字、方法、字段等)
访问字段
通过反射可以获取、设置private类型实例的字段值,但首先要调用 setAccessible(true)
- 反射是一种非常规手段
动态代理
两种方式
- JDK 动态代理:JDK提供的动态创建接口对象的方式
- CGLIB 动态代理(第三方库,Spring 框架大量使用)
- 区别
| 对比维度 | JDK 动态代理 | CGLIB 动态代理 |
|---|---|---|
| 实现原理 | 在运行时,动态实现目标类所实现的接口,造出一个“兄弟”类。 | 在运行时,动态继承目标类,造出一个“儿子”类(子类)。 |
| 核心要求 | 目标类必须实现接口。 | 目标类不能是 final 的(因为 final 类无法被继承)。 |
| 性能 | 在早期版本中创建代理较快,但现代 JVM 中两者性能差异已很小。 | 无法代理 final 方法(因为 final 方法无法被重写)。 |
原理:拦截+增强
运行时系统给你的不是真实对象,而是造出的一个代理对象(中介),当你调用它的方法时,它会拦截这个调用,执行一些**“增强”**逻辑(自己定义的额外逻辑),最后再可选地调用真实对象
- 动态代理 是 AOP ( 面向切面编程 ) 的核心技术之一。AOP 允许你把“横切”多个业务的通用功能从业务代码中抽离出来,集中管理。
动/静态代理方法
- 静态代理(Proxy 设计模式)
- 思想:在编译期就为特定类手动创建“一对一”的代理类
- 问题是:如果有100个服务,就必须手动编写100个对应的代理类
- 动态代理(JDK
java.lang.reflect.Proxy)- 思想:让 JVM 在运行时帮我自动生成这些代理类
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 BaBaLiBoo!


