Java RMI中代码库的重点是什么?

Sim*_*iil 3 java rmi codebase

我目前正在学习RMI.

我真的不明白代码库的概念.我读过的每篇论文都暗示,调用Remote对象的客户端可以从代码库加载Method定义.现在问题是:我不需要在类路径中使用描述/接口吗?如果我在运行时只知道它们,我如何调用远程对象上的方法?这甚至不会编译.

我完全忽略了这一点吗?那么代码库到底有什么意义呢?提供代码库似乎需要很多额外的工作和要求

谢谢

Edw*_*rzo 7

好吧,假设您只向您的客户端提供接口,并且实现将位于给定的代码库中.然后客户端请求服务器发送给定的对象,客户端期望接收实现给定接口的对象,但客户端不知道实际的实现,当它反序列化发送的对象时,它必须转到代码base并为正在传递的实际对象下载相应的实现类.

这将使客户端变得非常薄,并且您可以非常轻松地更新代码库中的类,而无需求助于更新每个客户端.

编辑

假设您有一个具有以下接口的RMI服务器

public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}
Run Code Online (Sandbox Code Playgroud)

客户只需将接口,用于MiddleEarthCreature,但没有在类路径中实现的.

其中的实现Creature是类型的序列化对象Elf,Man,DwarfHobbit.这些实现位于您的代码库中,但不在您的客户端类路径中.

当您要求RMI服务器向您发送中土世界中所有生物的列表时,它将发送实现的对象Creature,即上面列出的任何类.

当客户端收到序列化对象时,它必须查找类文件才能对它们进行反序列化,但这些文件不在本地类路径中.此流中的每个对象都标有给定的代码库,可用于查找缺少的类.因此,客户端借助代码库来查找这些类.在那里它会找到正在使用的实际生物类.

代码库在两个方向上都有效,因此这意味着如果您向服务器发送一个Creature(即一个Ent),它也会在代码库中查找它.

这意味着当客户端和服务器都需要发布新类型的生物时,他们所要做的就是更新creaturesImpl.jar代码库,而不是服务器或客户端应用程序本身.