CGLIB代理创建失败时不会抛出ProxyCreationException,因其不属于Spring或CGLIB标准异常体系;Spring通常将其包装为AopConfigException或BeanInstantiationException,根本原因是CGLIB依赖继承机制,故final类、无默认构造器、类路径缺失、模块化反射限制等均会导致CodeGenerationException。

当 CGLIB 代理创建失败时,CGLIB 本身会抛出 net.sf.cglib.core.CodeGenerationException(底层由字节码生成异常触发),但 Spring 等框架通常将其包装为 org.springframework.aop.framework.AopConfigException 或更通用的 org.springframework.cglib.proxy.CallbackFilter 相关异常。严格来说,Spring 并不直接抛出名为 ProxyCreationException 的异常——它并不存在于 Spring 或 CGLIB 的标准异常体系中。
为什么没有 ProxyCreationException?
Spring AOP 的代理创建过程由 DefaultAopProxyFactory 负责,它根据配置选择 JDK 动态代理或 CGLIB。若 CGLIB 创建失败(如目标类为 final、方法为 final、无默认构造器、SecurityManager 限制等),CGLIB 抛出 CodeGenerationException,Spring 会捕获并重新抛出为:
-
AopConfigException(最常见,继承自RuntimeException) - 有时是
BeanInstantiationException(若发生在 Bean 初始化阶段) - 底层可能包裹
NoClassDefFoundError、IllegalStateException或VerifyError
如何主动抛出自定义 ProxyCreationException?
如果你需要统一拦截并转为自定义异常(例如叫 ProxyCreationException),可自行封装:
- 定义异常类:public class ProxyCreationException extends RuntimeException
- 在代理创建逻辑外围 try-catch
AopConfigException或CodeGenerationException - 捕获后 new 并 throw 自定义异常,保留原始 cause(便于排查)
示例:
立即学习“Java免费学习笔记(深入)”;
try {
return new CglibAopProxy(advised).getProxy(classLoader);
} catch (AopConfigException ex) {
throw new ProxyCreationException("Failed to create CGLIB proxy for " + advised.getTargetClass(), ex);
}
常见导致 CGLIB 代理失败的原因及修复
定位问题比抛异常更重要。典型原因包括:
- 目标类或方法被
final修饰(CGLIB 通过继承实现代理,无法继承 final 类) - 类缺少无参构造函数(且未配置
useFactory = true) - 类路径缺失
cglib-nodep.jar或版本冲突(如与 Byte Buddy 冲突) - SecurityManager 限制了
RuntimePermission("defineClassInPackage.sun.reflect") - Java 17+ 使用强封装模块系统,反射访问受限(需添加
--add-opens参数)
调试建议
启用 CGLIB 日志可快速定位失败点:
- 加 JVM 参数:
-Dnet.sf.cglib.debug=true - 或设置日志级别:
logging.level.net.sf.cglib=DEBUG - 观察生成的类名(如
TargetClass$$EnhancerByCGLIB$$xxx)是否出现在堆栈中


















