扩展 - 反射和动态代理
# 反射和动态代理
TODO 待完善
# 反射
**定义:**反射是 Java 提供的一种基本功。通过反射直接操作类和对象。比如获取某个类的定义,访问类的成员属性或方法,调用方法或者构造对象,设置数值值,修改属性可见性,甚至可以运行时修改类的定义。反射机制的源码可见 java.lang.reflect 包。
实现方式:
应用场景:
- 在 O/R Mapping 框架中,对 Java 的实体对象在运行时动态生成 Setter 和 Getter 方法,减少重复性代码。
- TODO
# 动态代理
**定义:**动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制。通过代理可以让调用者与实现者之间解耦。
应用场景:
- 用来包装 RPC 调用
- 面向切面的编程(AOP)
- 框架内部的寻址、序列化、反序列化等
实现方式:
- JDK 自身提供的动态代理,使用反射机制实现
- 更高新能的字节码操作机制:ASM、cglib(基于ASM)、Javassist等
JDK Proxy 的优势:
- 最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠
- 平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用
- 代码实现简单
基于类似 cglib 框架的优势:
有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。
只操作我们关心的类,而不必为其他相关类增加工作量。
高性能
上次更新: 2022-12-29