Java RMI中代码库的作用究竟是什么?

5

我目前正在学习RMI。

我不太理解代码库的概念。我读的每一篇文章都建议,调用远程对象的客户端可以从代码库加载方法定义。 现在的问题是:我是否无论如何需要在我的类路径中有描述/接口?如果我只在运行时了解它们,如何调用远程对象上的方法?这甚至不会编译。

我是不是完全错过了重点?那么代码库的重点到底是什么?它似乎需要很多额外的工作和要求来提供一个代码库。

谢谢

1个回答

7
假设您向客户提供接口,而实现将位于给定的代码库中。然后客户端请求服务器发送一个特定对象,客户端期望接收实现特定接口的对象,但实际实现对客户端是未知的。当它反序列化发送的对象时,它必须访问代码库并下载传递的实际对象所需的相应实现类。这将使客户端非常简单,并且您可以很容易地更新代码库中的类,而无需更新每个客户端。
编辑:
假设您有一个带有以下接口的RMI服务器。
public interface MiddleEarth {
     public List<Creature> getAllCreatures();
}

客户端只会有 MiddleEarthCreature 的接口,但没有类路径中的实现。 Creature 的实现是可序列化的对象类型,包括 ElfManDwarfHobbit 等。这些实现位于您的代码库中,但不在客户端的类路径中。
当您请求 RMI 服务器发送 Middle Earth 中所有生物的列表时,它将发送实现 Creature 的对象,也就是上述任意一个类。
当客户端接收到序列化的对象时,它必须查找类文件以进行反序列化,但这些文件并未位于本地类路径中。流中的每个对象都带有给定的代码库标记,可以用来查找缺失的类。因此,客户端会借助代码库查找这些类。在那里,它将找到实际使用的生物类。
代码库可以双向工作,这意味着如果您向服务器发送一个 Creature(例如一个 Ent),它也会在代码库中查找。
这意味着当客户端和服务器需要发布新类型的生物时,他们只需要更新代码库中的 creaturesImpl.jar,而无需更新服务器或客户端应用程序本身。

为什么客户端要知道服务器如何实现接口,既然一切都在服务器上运行?客户端只需要知道接口,这样它就可以调用客户端的方法。我错了吗? - Simiil
@Simil 我们正在谈论你和服务器之间交换的可序列化对象。请查看我的编辑答案。 - Edwin Dalorzo
@Edwin - 'Codebase' 的优势是什么?任何新的实现只需要在 'Codebase' 中更新,服务器或客户端就可以从 'Codebase' 中获取它,而不必为每个客户端或服务器提供类/ jar。另外,虽然可能不可取,但 'Codebase' 是否强制使用?我的意思是,即使它是不良设计,我是否可以避免使用 'Codebase'?因此,如果服务器和客户端具有必要的 jar 文件,并且我不预计更改任何内容,则不需要配置 'Codebase',对吗? - akila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接