在 Java 中使用 Proxy(代理) 时,无论是 JDK 动态代理 还是 CGLIB 代理,都容易踩一些常见坑。下面按类型 + 错误现象 + 原因 + 解决办法总结。
错误现象
Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler
);
抛异常:
IllegalArgumentException: com.xxx.TargetClass is not an interface
原因
解决
错误现象
TargetClass proxy = (TargetClass) Proxy.newProxyInstance(...);
抛:
ClassCastException
原因
解决
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(...);
错误现象
原因
public Object invoke(Object proxy, Method method, Object[] args) {
return null; // 没调原方法
}
解决
return method.invoke(target, args);
错误现象
原因
proxy.toString(); // 又会进 invoke
解决
现象
解决
if (method.getDeclaringClass() == Object.class) {
return method.invoke(target, args);
}
错误
NoClassDefFoundError: net/sf/cglib/proxy/Enhancer
解决
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
现象
原因
解决
现象
原因
解决
错误现象
public void a() {
b(); // 不会被代理
}
原因
this.b() 不是代理对象解决
现象
原因
@Service
public class UserService {
public void a() {
b(); // 不会被代理
}
@Transactional
public void b() {}
}
解决
if (obj instanceof UserService) // false
解决
AopUtils.isAopProxy(obj);
AopUtils.getTargetClass(obj);
✅ 优先使用接口(JDK 代理)
✅ 避免代理逻辑过于复杂
✅ 明确区分 target / proxy
✅ 日志、事务、权限适合代理
❌ 不要在代理中做重业务逻辑
如果你有具体报错信息或代码场景(Spring / MyBatis / RPC),我可以帮你精确分析。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。