- 我知道,曾经,开发远程代理包括生成 stub /骨架,但今天由于反射不再需要它。 (动态代理)
我想清楚地解释反射为何以及如何取代这种需求。 例如,我知道 stub 应该处理网络通信(如果远程对象在另一台计算机上),加上负责序列化/反序列化等......现在谁负责?
也许我完全弄错了动态代理的概念。
- 此外,我还阅读了有关 Java 和 Rmi 的主题,我将如何在 C++ 中实现远程代理, 我可能可以使用 DCOM,还有其他更简单的方法吗? (我是否需要 DCom 中的 stub /骨架或不再需要 Java?)
谢谢
最佳答案
假设您有一个接口(interface) A
,B 类实现 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 的对象上调用此名称的此方法 [使用这些参数]” 的请求,并且服务器可以通过反射执行该任务没有问题。然后将返回值以类似的方式发送回客户端。
所以自己做这个真的不难。 Sun 的 RMI 可能也在做同样的事情(RMI 有一些其他的特性,比如远程垃圾收集)。见http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html
关于java - 远程和动态代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1843409/