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
}
}
EDIT 2:このコードも機能します (ただし、EDIT 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