RMI:作为方法调用结果的列表操作无效

时间:2013-07-03 18:52:23

标签: java rmi

我创建了一个简单的例子来试验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

1 个答案:

答案 0 :(得分: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());