我目前正在学习 RMI。
我不太了解代码库的概念。我阅读的每篇论文都表明,调用远程对象的客户端可以从代码库中加载方法定义。现在的问题是:我不需要类路径中的描述/接口吗?如果我只在运行时知道它们,我如何调用远程对象上的方法?这甚至不会编译。
我完全错过了这里的重点吗?那么代码库到底有什么意义呢?提供代码库似乎需要做很多额外的工作和要求
谢谢
好吧,假设您只向客户端提供接口,并且实现将位于给定的代码库中。然后客户端请求服务器发送一个给定的对象,客户端期望接收一个实现给定接口的对象,但是实际的实现对于客户端来说是未知的,当它反序列化发送的对象时它必须去代码base 并为正在传递的实际对象下载相应的实现类。
这将使客户端非常瘦,并且您将非常轻松地更新代码库中的类,而不必诉诸于更新每个客户端。
编辑
假设您有一个具有以下界面的 RMI 服务器
public interface MiddleEarth {
public List<Creature> getAllCreatures();
}
客户端将只有 和 的接口MiddleEarth
,Creature
但在类路径中没有任何实现。
其中 的实现是 、 和 类型的可序列化Creature
对象。这些实现位于您的代码库中,但不在您客户端的类路径中。Elf
Man
Dwarf
Hobbit
当您要求您的 RMI 服务器向您发送中土世界中所有生物的列表时,它会发送实现 的对象Creature
,即上面列出的任何类。
当客户端接收到序列化的对象时,它必须查找类文件才能对它们进行反序列化,但这些文件并不位于本地类路径中。此流中的每个对象都带有给定的代码库标记,可用于查找缺失的类。因此,客户端求助于代码库来查找这些类。在那里它将找到正在使用的实际生物类。
代码库双向工作,因此这意味着如果您向服务器发送 a Creature
(即 an Ent
),它也会在代码库中查找它。
这意味着当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新creaturesImpl.jar
代码库中的内容,而不是服务器或客户端应用程序本身。