Проблема с Java RMI Proxy - PullRequest
3 голосов
/ 12 мая 2010

Я получаю эту ошибку:

 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)

Я запускаю мастер в cmd, прослушивая порт 5225.

1 Ответ

4 голосов
/ 12 мая 2010

Класс $Proxy0 является динамическим прокси , то есть класс генерируется Java во время выполнения.

Этот класс должен реализовывать интерфейс Abstract, но не расширяет Call. Таким образом, вы не можете уменьшить его до Call (это дает приведение класса), но снижение до Abstract должно быть в порядке.

Если вы используете RMI, вы должны связываться с удаленным объектом только через интерфейсы.

PS: Abstract - довольно запутанное имя. Я действительно думал, что вы говорите сначала о абстрактном классе . Я бы переименовал это, если это возможно. То же самое для rmi.engine, предпочитайте что-то вроде org.myproject, чтобы избежать путаницы с внутренним классом JDK.

...