Java 中 Proxy(代理)失败是一个很常见的问题,通常不是“代理本身有 bug”,而是使用方式或条件不满足。下面按最常见原因 → 原理 → 解决办法来系统说明。
Java 动态代理(java.lang.reflect.Proxy)只能代理“接口”:
Proxy.newProxyInstance(
classLoader,
new Class[]{SomeInterface.class},
invocationHandler
);
✅ 成功条件:
❌ 失败条件:
class UserService { }
Proxy.newProxyInstance(..., new Class[]{UserService.class}, ...); // ❌
❌ 报错:
java.lang.IllegalArgumentException: ... is not an interface
✅ 解决:
interface UserService { }
class UserServiceImpl implements UserService { }
public class UserServiceImpl implements UserService {
public void hello() { } // 接口没有
}
UserService proxy = ...;
proxy.hello(); // ❌ 不会走 InvocationHandler
✅ 原因:
✅ 解决:
public void a() {
this.b(); // ❌
}
public void b() {}
即使 b() 被代理:
this 是 原始对象✅ 解决:
AopContext.currentProxy()final class UserService { }
或:
final void save() { }
❌ 结果:
✅ 解决:
finalUserServiceImpl impl = (UserServiceImpl) proxy; // ❌
✅ 正确:
UserService userService = (UserService) proxy;
Proxy.newProxyInstance(
OtherClassLoader,
new Class[]{UserService.class},
handler
);
❌ 报错:
ClassCastException
✅ 解决:
| 特性 | JDK Proxy | CGLIB |
|---|---|---|
| 代理对象 | 接口 | 类 |
| 性能 | 快 | 稍慢 |
| final | 不支持 | 不支持 |
| Spring 默认 | 有接口 | 无接口 |
代理失败请依次检查:
thisfinal你可以直接贴:
我可以精准定位你这个代理为什么失败。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。