转:
动态代理之: 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如何来解释这个方法返回值 
返回指定接口的实体类 
 具体为什么不能用实现类来接收 而是要用 接口 我还不是很明白 
 以上都是个人见解 欢迎讨论
动态代理怎么实现 可以看一下这篇博客 在最后那一块知识