温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy代理常见错误

发布时间:2026-10-31 07:44:14 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

在 Java 中使用 Proxy(代理) 时,无论是 JDK 动态代理 还是 CGLIB 代理,都容易踩一些常见坑。下面按类型 + 错误现象 + 原因 + 解决办法总结。


一、JDK 动态代理常见错误

1. 目标类没有实现接口

错误现象

Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(),
    handler
);

抛异常:

IllegalArgumentException: com.xxx.TargetClass is not an interface

原因

  • JDK 动态代理 只能代理接口

解决

  • 让目标类实现接口
  • 或使用 CGLIB

2. 代理对象强转为实现类

错误现象

TargetClass proxy = (TargetClass) Proxy.newProxyInstance(...);

抛:

ClassCastException

原因

  • 代理对象是 接口的实现类,不是原类

解决

TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(...);

3. invoke 中未调用原方法

错误现象

  • 方法无效果
  • 返回 null

原因

public Object invoke(Object proxy, Method method, Object[] args) {
    return null; // 没调原方法
}

解决

return method.invoke(target, args);

4. 在 invoke 中调用 proxy 自身方法(递归)

错误现象

  • 栈溢出(StackOverflowError)

原因

proxy.toString(); // 又会进 invoke

解决

  • 不要通过 proxy 调用自身
  • 使用 target

5. equals / hashCode / toString 被代理

现象

  • 日志混乱、判断异常

解决

if (method.getDeclaringClass() == Object.class) {
    return method.invoke(target, args);
}

二、CGLIB 代理常见错误

6. 未引入 cglib / asm 依赖

错误

NoClassDefFoundError: net/sf/cglib/proxy/Enhancer

解决

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>

7. 代理 final 类或 final 方法

现象

  • 代理失败
  • 方法未被拦截

原因

  • CGLIB 通过继承实现,final 不能重写

解决

  • 去掉 final

8. 构造方法被调用多次

现象

  • 日志打印多次构造

原因

  • CGLIB 创建代理对象时会调用父类构造

解决

  • 避免在构造方法中写重要逻辑

9. 方法内部调用(self invocation)不生效

错误现象

public void a() {
    b(); // 不会被代理
}

原因

  • this.b() 不是代理对象

解决

  • 注入自身代理对象
  • 或用 AspectJ

三、Spring AOP / Proxy 常见错误

10. 方法是 private / static / final

现象

  • 切面不生效

原因

  • Spring 代理无法增强这些方法

11. 同类方法调用

@Service
public class UserService {
    public void a() {
        b(); // 不会被代理
    }
    @Transactional
    public void b() {}
}

解决

  • 拆类
  • 或用 AopContext

12. 代理对象类型判断错误

if (obj instanceof UserService) // false

解决

AopUtils.isAopProxy(obj);
AopUtils.getTargetClass(obj);

四、通用建议

✅ 优先使用接口(JDK 代理)
✅ 避免代理逻辑过于复杂
✅ 明确区分 target / proxy
✅ 日志、事务、权限适合代理
❌ 不要在代理中做重业务逻辑


如果你有具体报错信息或代码场景(Spring / MyBatis / RPC),我可以帮你精确分析。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手