说你有一个interface A
, 和class B implements A
。
服务器 VM 有一个 B 实例;它与名称相关联;服务器侦听 TCP 端口以进行客户端通信。像这样的东西:
Server server = new Server(localhost, port);
server.bind("bbbb", new B() );
在客户端 VM 上,您希望访问驻留在服务器 VM 上的 B 对象。您需要获得对它的引用(A 类)
A bb = lookup(serverIp, port, "bbbb");
bb
是 的子类A
,由 . 创建java.lang.reflect.Proxy
。任何方法调用bb
都由 处理InvocationHandler
,它以任何方式对调用进行编码,并通过线路将其发送到服务器。服务器收到“在名为 bbbb 的对象上调用此名称的方法 [with these arguments]”的请求,并且服务器通过反射执行该任务没有问题。然后以类似的方式将返回值发送回客户端。
所以自己做这件事真的不难。Sun 的 RMI 可能也在做同样的事情(RMI 还有一些其他功能,比如远程垃圾收集)。见http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html