java proxy rmi

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.