RMI的动态代理存根实现

时间:2009-03-31 15:48:18

标签: java rmi dynamic-proxy

我想了解动态代理存根实现是如何在场景后面实际完成的。根据我读到的,如果没有找到预先生成的存根类,则在导出远程对象时,RMI运行时将生成动态代理以充当存根。然后该存根绑定到RMI注册表,稍后可由某些RMI客户端访问。

问题是:由于存根实际上是一个动态生成的代理,它的类定义在客户端不可用,那么客户端如何仍能从RMI注册表中检索存根?是否有某种动态类加载发生在幕后或RMI是否使用另一种技术来解决这个问题?

2 个答案:

答案 0 :(得分:2)

Java.lang.reflect.Proxy是可序列化的,它在ObjectOutputStream和ObjectInputStream中有特殊支持。基本上只是实现的接口和调用处理程序被序列化,并且在反序列化期间构造一个新的动态代理。

答案 1 :(得分:-2)

RMI确实使用动态类加载 - 类路径与调用一起作为“类路径注释”发送,客户端从中加载类。您可以查看RMI实现以获取更多信息 - 它可作为JDK源的一部分提供。具体来说,类ObjectOutputStream和RMIClassloader。

更新:RMI无法启动HTTP服务器 - 实际上,您需要自定义解决方案。您提到的其中一个可以是您运行的HTTP服务器,通过服务器使类可用,并将代码库与存根中的HTTP服务器地址/端口一起传递,以便您的客户端可以下载它们。