【Java】【Proxy】com.sun.proxy.$ProxyXXX cannot be cast to XXX

问题描述

springboot项目中使用动态代理来调用方法

// 动态代理;cls是一个类;Strategy是一个接口
Strategy strategy = (Strategy) Proxy.newProxyInstance(cls.getClass().getClassLoader(), cls.getClass().getInterfaces(), new InvocationHandler() {
    @Override
    public Object invoke(Object Proxy, Method method, Object[] args) throws Throwable {
        // 增强的逻辑代码...
        return method.invoke(cls.getClass(), args);
    }
})

原因分析

Proxy.newProxyInstance()生成的代理对象无法强转为Strategy。

网上说是因为被代理的类没有继承接口,而是继承了一个基类。但本例中确实是接口。

JDK动态代理的原理是根据定义好的规则,用传入的接口创建一个新类,这就是为什么采用动态代理时为什么只能用接口引用指向代理,而不能用传入的类引用执行动态类(摘自网络)。

解决方法

打印(或断点查看)cls.getClass().getClassLoader() 和cls.getClass().getInterfaces() 对象内容

Class<?> interfaces = cls.getClass().getInterfaces();

发现,interfaces对象中根本没有实现的Strateg接口对象。通过打印(或断点查看)cls.getInterfaces()对象

Class<?> interfaces = cls.getInterfaces();

发现,存在Strategy接口。

其他(ClassLoader、invoke方法第一个参数)根据情况作出修改。

故总结为:动态代理没有找到要代理的接口,此时要确认代理的接口是否"存在",从而传入正确的参数。

参考文章

primary:https://blog.csdn.net/qq_38409944/article/details/80296354

secondary:https://www.cnblogs.com/zhuochangjing/p/4975055.html

secondary:https://blog.csdn.net/kuaisuzhuceh/article/details/44756333

secondary:https://www.jianshu.com/p/9bcac608c714

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值