говорят, что у вас есть interface A
и class B implements A
.
Виртуальная машина сервера имеет один экземпляр B; это связано с именем; сервер прослушивает порт TCP для связи с клиентом. как то так:
Server server = new Server(localhost, port);
server.bind("bbbb", new B() );
на клиентской виртуальной машине вы хотите получить доступ к этому объекту B, находящемуся на серверной виртуальной машине. Вам необходимо получить ссылку (типа А) на нее
A bb = lookup(serverIp, port, "bbbb");
bb
- это подкласс A
, созданный с помощью java.lang.reflect.Proxy
. любой вызов метода на bb
обрабатывается InvocationHandler
, который кодирует вызов любым способом и отправляет его на сервер по сети. сервер получает запрос «вызова этого метода с этим именем [с этими аргументами] для объекта с именем bbbb», и у сервера не возникает проблем при выполнении этой задачи с отражением. затем возвращаемое значение отправляется обратно клиенту аналогичным образом.
Так что на самом деле не сложно сделать это самостоятельно. RMI от Sun, вероятно, делает то же самое (RMI имеет некоторые другие функции, такие как удаленная сборка мусора). см http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html