动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询、以及 RPC Dubbo 远程调用等,都有非常多的实际应用
Java 动态代理原理
按照代理的创建时期,代理类可以分为两种:
- 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译,在程序运行前,代理类的 .class 文件就已经存在了。
- 动态代理:在程序运行时,可以运用反射机制动态创建代理类的 .class 文件。
动态代理类与静态代理类最主要的不同点是:代理类的字节码不是在程序运行前生成的,而是在程序运行时再虚拟机中程序自动创建的。
动态代理的实现方式很多。例如:JDK 自身提供的动态代理,就利用了上面提到的反射机制。除了反射,动态代理还可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。
简单来说,动态代理是一种行为方式,而 反射或 ASM 只是它的一种实现手段而已。
本文我主要详解 Java 动态代理的 2 种主流现方式:JDK 原生动态代理与 CGLib 。
JDK 原生动态代理
JDK Proxy 动态代理的实现无需引用第三方类,只需要实现 InvocationHandler 接口,重写 invoke() 方法即可,整个实现代码如下所示:、
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.l