• 动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题


    转:

    动态代理之: com.sun.proxy.$Proxy0 cannot be cast to 问题

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/80296354
    Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Father.FatherInter
        at Father.Main.main(Main.java:13)
    • 1
    • 2

    不知道写动态代理的时候 你们有没有被这个问题困扰过
    反正我是有的 不过和网上的问题不一样

    Google很多 答案都是 因为被代理的类没有继承接口 而是继承了一个基类

    问:为什么动态代理必须针对接口?
    **答:**JDK动态代理的原理是根据定义好的规则,用传入的接口创建一个新类,这就是为什么采用动态代理时为什么只能用接口引用指向代理,而不能用传入的类引用执行动态类。(摘自网络 自己没有看源码)

    我的 问题 则是因为

    Son s = (Son)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);
    • 1

    在我这里 Son是实现接口的实现类 这个时候就GG了

    正解是

    FatherInter s = (FatherInter)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);
    • 1

    在我这里 FatherInter是那个被实现的接口

    两者唯一区别就是 Proxy.newProxyInstance返回的是接口类型 而我 却用实现类来接受 就出现了类型不匹配的问题

    来看一下 官方API如何来解释这个方法返回值
    这里写图片描述

    返回指定接口的实体类
    具体为什么不能用实现类来接收 而是要用 接口 我还不是很明白
    以上都是个人见解 欢迎讨论

    动态代理怎么实现 可以看一下这篇博客 在最后那一块知识

  • 相关阅读:
    jar 命令 打包装class文件的文件夹
    快捷下载 sourceForge下的资源
    win7 解决git clone 连接被拒绝—hosts文件过期
    tp_link路由器 重新设置
    gradle研究
    开始玩mondrian
    让eclipse启动时拥有jre
    qt md5加密,base64编码解码
    qt 网络库使用介绍
    c 正则表达式
  • 原文地址:https://www.cnblogs.com/libin6505/p/10705749.html
Copyright © 2020-2023  润新知