我希望得到一个明确的解释,说明为什么以及如何反映这种需要。 例如,我知道存根是假设通过网络处理通信(如果远程对象在不同的计算机上),加上负责序列化/反序列化等等......谁现在负责呢?
也许我的动态代理概念都错了。
感谢
答案 0 :(得分:1)
说你有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
处理,{{1}}以任何方式对调用进行编码,并通过线路将其发送到服务器。服务器收到“在对象命名的bbbb上调用此名称[带有这些参数]的方法”的请求,服务器使用反射执行该任务没有问题。然后以类似的方式将返回值发送回客户端。
因此,自己做这件事真的不难。 Sun的RMI可能也在做同样的事情(RMI还有其他一些功能,比如远程垃圾收集)。见http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
答案 1 :(得分:0)
如果我没有误会,存根/骨架是由rmic工具静态创建的,而现在整个过程都是动态的。
它不一定是“更好”,但只是消除了编译存根和骨架的麻烦。在这两种情况下,请求参数和响应都以相同的方式序列化,几乎在同一级别。
关于问题#1:RMI的某些实现使用Corba,因此如果代码可用,您可能需要查看它。
您需要的只是将C ++代码与Corba层接口作为存根/骨架。