Problema de Java RMI Proxy
(1)
Estoy recibiendo este error:
java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call
at Main.main(Main.java:39)
Mi clase Abstract
y Call
extienden Remote
.
Llamada:
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";
}
}
Abstracto:
public interface Abstract extends Remote {
String getHello() throws RemoteException;
}
Este es mi principal:
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 dice que el problema está en la línea 39, que es
System.out.println(((Call)ss).getHello());
La salida se ve así:
Correr:
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)
Estoy ejecutando un master en cmd escuchando en el puerto 5225.
La clase $Proxy0
es un proxy dinámico , es decir, una clase se genera por java en tiempo de ejecución.
Esta clase debe implementar la interfaz Abstract
, pero no extiende la Call
. Entonces no puedes bajarlo a Call
(esto da un molde de clase), pero bajarlo a Abstract
debería estar bien.
Si usa RMI, solo debe comunicarse con objetos remotos a través de las interfaces.
PD: El Abstract
es una especie de nombre confuso. Realmente pensé que estabas hablando de clase abstracta primero. Cambiaría el nombre si fuera posible. Lo mismo para rmi.engine
, prefiera algo como org.myproject
, para evitar confusiones con la clase interna del JDK.