天天看點

動态代理之: com.sun.proxy.$Proxy0 cannot be cast to 問題

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to Father.FatherInter
    at Father.Main.main(Main.java:13)           

不知道寫動态代理的時候 你們有沒有被這個問題困擾過

反正我是有的 不過和網上的問題不一樣

Google很多 答案都是 因為被代理的類沒有繼承接口 而是繼承了一個基類

問:為什麼動态代理必須針對接口?

**答:**JDK動态代理的原理是根據定義好的規則,用傳入的接口建立一個新類,這就是為什麼采用動态代理時為什麼隻能用接口引用指向代理,而不能用傳入的類引用執行動态類。(摘自網絡 自己沒有看源碼)

我的 問題 則是因為

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

在我這裡 Son是實作接口的實作類 這個時候就GG了

正解是

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

在我這裡 FatherInter是那個被實作的接口

兩者唯一差別就是 Proxy.newProxyInstance傳回的是接口類型 而我 卻用實作類來接受 就出現了類型不比對的問題

來看一下 官方API如何來解釋這個方法傳回值

傳回指定接口的實體類

具體為什麼不能用實作類來接收 而是要用 接口 我還不是很明白

以上都是個人見解 歡迎讨論

動态代理怎麼實作 可以看一下這篇部落格 在最後那一塊知識