我收到此错误:
java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call
at Main.main(Main.java:39)
我的Abstract
和Call
类都延伸Remote
。
呼叫:
public class Call extends UnicastRemoteObject implements rmi.engine.Abstract {
public Call() throws Exception {
super(Store.PORT, new RClient(), new RServer());
}
public String getHello() {
System.out.println("CONN");
return "HEY";
}
}
摘要:
public interface Abstract extends Remote {
String getHello() throws RemoteException;
}
这是我的主要内容:
public static void main(String[] args) {
if (args.length == 0) {
try {
System.out.println("We are slave ");
InetAddress ip = InetAddress.getLocalHost();
Registry rr = LocateRegistry.
getRegistry(ip.getHostAddress(), Store.PORT, new RClient());
Object ss = rr.lookup("FILLER");
System.out.println(ss.getClass().getCanonicalName());
System.out.println(((Call)ss).getHello());
} catch (Exception e) {
e.printStackTrace();
}
} else {
if (args[0].equals("master")) {
// Start Master
try {
RMIServer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
Netbeans说问题出在第39行,这是
System.out.println(((Call)ss).getHello());
输出如下:
执行命令
We are slave
Connecting 10.0.0.212:5225
$Proxy0
java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call
at Main.main(Main.java:39)
BUILD SUCCESSFUL (total time: 1 second)
我正在使用端口5225监听cmd中的主人。
答案 0 :(得分:4)
类$Proxy0
是dynamic proxy,也就是说,一个类是在运行时由java生成的。
此类应实现接口Abstract
,但不扩展Call
。所以你不能将它向下转换为Call
(这会给出一个类强制转换),但是将它向下转换为Abstract
应该没问题。
如果使用RMI,则只应通过接口与远程对象通信。
PS:Abstract
是一个令人困惑的名字。我真的以为你先说的是abstract class。如果可能的话我会重命名。与rmi.engine
相同,更喜欢org.myproject
之类的内容,以避免与JDK的内部类混淆。