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