我目前正在学习 RMI。
我不太理解代码库的概念。我读到的每篇论文都表明,调用远程对象的客户端可以从代码库加载方法定义。
现在的问题是:我的类路径中是否不需要描述/接口?如果我只在运行时知道远程对象上的方法,我如何调用它们?这甚至无法编译。
我完全没有抓住要点吗?那么代码库到底有什么意义呢?提供代码库似乎有很多额外的工作和要求
thanks
好吧,假设您只向客户端提供接口,并且实现将位于给定的代码库中。然后客户端请求服务器发送一个给定的对象,客户端期望收到一个实现给定接口的对象,但是实际的实现对于客户端来说是未知的,当它反序列化发送的对象的时候就得去代码了基础并下载所传递的实际对象的相应实现类。
这将使客户端变得非常瘦,并且您将非常轻松地更新代码库中的类,而不必更新每个客户端。
EDIT
假设您有一个具有以下接口的 RMI 服务器
public interface MiddleEarth {
public List<Creature> getAllCreatures();
}
客户端只有以下接口MiddleEarth
and Creature
,但类路径中没有任何实现。
其中的实施Creature
是类型的可序列化对象Elf
, Man
, Dwarf
and Hobbit
。这些实现位于您的代码库中,但不在客户端的类路径中。
当您要求 RMI 服务器向您发送中土世界中所有生物的列表时,它将发送实现Creature
,即上面列出的任何类。
当客户端收到序列化对象时,它必须查找类文件才能反序列化它们,但这些文件并不位于本地类路径中。该流中的每个对象都标有给定的代码库,可用于查找丢失的类。因此,客户端求助于代码库来查找这些类。在那里它将找到正在使用的实际生物类。
代码库双向工作,因此这意味着如果您向服务器发送Creature
(即Ent
)它也会在代码库中查找它。
这意味着当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新creaturesImpl.jar
在代码库中,在服务器或客户端应用程序本身中没有任何内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)