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

Java RMI:作为方法调用的结果对列表执行的操作无效,java,rmi,Java,Rmi,我创建了一个简单的示例来试验Java的RMI特性。非常好。但是当我调用一个返回LinkedList对象的远程方法并向列表中添加一个元素时:什么都没有发生——元素没有添加。见下面我的代码: 服务器上的接口和实现(远程对象): 客户端代码: FooBar foo = (FooBar) Naming.lookup("//" + hostname + "/foobar"); foo.getList().add(new String("Bar")); System.out.println(foo.get

我创建了一个简单的示例来试验Java的RMI特性。非常好。但是当我调用一个返回LinkedList对象的远程方法并向列表中添加一个元素时:什么都没有发生——元素没有添加。见下面我的代码:

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

客户端代码:

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
    }

}
输出将是0而不是1

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

System.out.println(foo.getList().size());
您应该使用以下代码:

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

System.out.println(list.size());
List List=(List)foo.getList();
添加(新字符串(“条”);
System.out.println(list.size());

您是否在服务器端的
列表中添加了任何内容?如果是,则显示您的代码编号。我的场景和上面描述的一样简单。为什么列表应该是空的?在对象初始化时,将创建并仅返回新的
LinkedList
。正如您在编辑1中看到的,它适用于一个简单的场景。我是否遗漏了什么?我想他也在做同样的事情。@zerocool仔细看我的帖子,我从
foo.getList()
获得了
List
对象,并将
Bar
添加到
List
中,然后打印它的大小。。这与操作码相反。他正在一个匿名的
列表中添加
Bar
。)并打印通过
foo.getList()
再次获得的新鲜
List
对象的大小。这是可行的,但我想更改服务器上的List对象,而不是我的本地对象。@mytbu:那么在这种情况下,您将填充的
列表
对象从客户端发送回服务器,并在服务器上创建一个方法,您将从客户端接收
列表
对象。@Mac:这是一个想法,但我现在正试图复制这个简单的示例(编辑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
System.out.println(foo.getList().size());
List<Object> list = (List<Object>)foo.getList();
list.add(new String("Bar"));

System.out.println(list.size());