0

我创建了一个简单的示例来试验 Java 的 RMI 特性。这很不错。但是当我调用一个返回LinkedList 对象的远程方法并将一个元素添加到列表中时:没有任何反应 - 没有添加该元素。请参阅下面的代码:

服务器上的接口和实现(远程对象):

public interface FooBar extends Remote {
    List<Object> getList() throws RemoteException;
}

public class FooBarImpl extends UnicastRemoteObject implements FooBar {

    private static final long serialVersionUID = -200889592677165250L;
    private List<Object> list = new LinkedList<Object>();

    protected CompanyImpl() throws RemoteException { }

    public List<Object> getList() { return list; }

}

绑定它的代码(服务器):

Naming.rebind("//" + hostname + "/foobar", new FooBarImpl());

客户端代码:

FooBar foo = (FooBar) Naming.lookup("//" + hostname + "/foobar");
foo.getList().add(new String("Bar"));

System.out.println(foo.getList().size());

输出将0代替1. 所以我的简单问题是:如何在不使用add方法的情况下修复它(因为add在服务器端使用方法它可以工作)?

编辑 1: 此代码运行良好:

public class FooBarTest {

    static class FooBarImpl {
        public List<Object> list = new LinkedList<Object>();
        public List<Object> getList() { return list; };
    }

    public static void main(String[] args) {
        FooBarImpl test = new FooBarImpl();

        test.getList().add(new String("Foo"));
        System.out.println(test.getList().size()); // = 1
    }

}

编辑 2:此代码也有效(但我试图从编辑 1 复制简单代码):

@Override
public void add(Object o) throws RemoteException {
    list.add(o);
}

FooBar foo = (FooBar) Naming.lookup("//" + hostname + "/foobar");
foo.add(new String("Bar"));

System.out.println(foo.getList().size()); // == 1
4

1 回答 1

0

输出将是 0 而不是 1

之所以如此,是因为,您正在将元素添加Bar到通过获得的匿名List对象中,foo.getList()但您正在打印List再次获得的新对象的大小,该对象foo.getList()在以下行中为空:

System.out.println(foo.getList().size());

您应该使用以下代码:

List<Object> list = (List<Object>)foo.getList();
list.add(new String("Bar"));

System.out.println(list.size());
于 2013-07-03T19:05:31.963 回答