2010-05-12 2 views
3

Je reçois cette erreur:Java RMI question Proxy

java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call 
     at Main.main(Main.java:39) 

Mon Abstract et Call classe à la fois étendre Remote.

Appel:

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"; 
    } 
} 

Résumé:

public interface Abstract extends Remote { 

    String getHello() throws RemoteException; 

} 

Ceci est mon 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 dit que le problème est sur la ligne 39, qui est

System.out.println(((Call)ss).getHello()); 

La sortie ressemble à ceci:

Run:

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) 

Je courais un maître cmd écoute sur le port 5225.

+0

Vraiment utile pour moi. Comme je l'ai également créé objet de l'implémentation du serveur au lieu de l'interface. Vous devez garder à l'esprit que lorsque vous appelez des programmes serveur, c'est-à-dire des méthodes à distance, vous devez les appeler par interface définie. –

Répondre

4

La classe $Proxy0 est un dynamic proxy, qui est une classe est généré par Java à l'exécution.

Cette classe doit implémenter l'interface Abstract, mais ne s'étend pas Call. Donc, vous ne pouvez pas le baisser à Call (cela donne un casting de classe), mais downcasting à Abstract devrait être ok.

Si vous utilisez RMI, vous ne devez communiquer qu'avec des objets distants via des interfaces.

PS: Abstract est un peu un nom confus. Je pensais vraiment que vous parliez d'abord de abstract class. Je renommerais cela si possible. Idem pour rmi.engine, préférez quelque chose comme org.myproject, pour éviter toute confusion avec la classe interne du JDK.

+0

Merci beaucoup d'avoir signalé l'erreur évidente! Lifesaver! –