如何解决Java RMI中com.sun.proxy.$Proxy0无法转型为自定义接口的问题
问题根因
你的BonjourClass远程实现类没有实现自定义的远程接口bonjourInterface1,仅继承了UnicastRemoteObject。RMI底层基于JDK动态代理生成远程存根,生成的代理类只会实现远程对象显式实现的Remote子接口,因此返回的代理对象不具备bonjourInterface1类型,强制转型就会抛出对应异常。
修复方案
修改BonjourClass的类声明,添加对bonjourInterface1接口的实现即可,修改后代码如下:
package RMI; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; // 新增implements实现远程接口 public class BonjourClass extends UnicastRemoteObject implements bonjourInterface1 { public BonjourClass() throws RemoteException { super(); } // 建议添加@Override注解校验接口方法实现的正确性 @Override public String Bonjour(String name) throws RemoteException { return "Bonjour si sayed "+name ; } }
修改完成后清理所有历史编译的class文件,重新编译全量代码,先启动服务端再启动客户端即可正常运行。
额外注意事项
- 服务端和客户端的
bonjourInterface1、BonjourClass的包路径必须完全一致,否则也会触发类加载不匹配导致的类型转换异常 - 建议遵循Java命名规范,接口名采用大驼峰命名,比如调整为
BonjourInterface,提升代码可读性
内容的提问来源于stack exchange,提问作者Mazen haj ali the best
相关产品推荐
相关产品推荐

