本质区别在于生成代理对象的方式和适用前提完全不同:jdk代理基于接口反射生成实现类,要求目标实现接口;cglib基于继承字节码增强生成子类,要求目标类非final。

本质区别在于生成代理对象的方式和适用前提完全不同。
代理生成机制不同
JDK 动态代理基于接口和反射,在运行时生成一个实现目标接口的新类,该类继承自 java.lang.reflect.Proxy,所有方法调用都统一转发到 InvocationHandler.invoke()。它不修改目标类,也不依赖字节码操作。
CGLIB 代理基于继承和字节码增强,在运行时通过 ASM 库为目标类动态生成一个子类,覆盖其非 final 方法,并在方法中插入拦截逻辑(MethodInterceptor)。它必须能继承目标类,因此无法处理 final 类或 final 方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
对目标对象的要求不同
- JDK 动态代理要求目标对象至少实现一个接口;否则无法生成代理
- CGLIB 代理不要求接口,可直接代理任意非 final 的普通类
- 若目标类实现了接口但又想用 CGLIB,可以强制启用;反之,没接口就无法使用 JDK 代理
运行时行为特征不同
JDK 代理的方法调用走的是反射路径,每次调用都要经过 method.invoke(),初始化快、单次调用开销略高;CGLIB 代理方法调用是直接的(子类调用父类方法),单次性能更好,但首次生成子类需解析并修改字节码,初始化耗时明显更长。
另外,JDK 代理对象与目标对象是“平级”关系(都实现同一接口);CGLIB 代理对象是目标对象的子类实例,proxy instanceof TargetClass 返回 true,而 JDK 代理则为 false。
依赖与扩展性不同
JDK 动态代理是 Java 标准库原生支持,无需额外依赖;CGLIB 是第三方库(需引入 cglib-nodep 或相关包),且底层强依赖 ASM 字节码框架。这也意味着 CGLIB 更灵活——比如能支持字段访问、构造器拦截等高级场景,而 JDK 代理仅限于接口方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










