本文介紹了Java RMI中的代碼庫到底有什么意義?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我目前正在學習RMI。
我不太理解代碼庫的概念。我讀到的每篇論文都表明,調用遠程對象的客戶端可以從代碼庫加載方法定義。
現在的問題是:我不需要類路徑中的描述/接口嗎?如果我只在運行時知道遠程對象上的方法,我如何調用這些方法呢?這甚至無法編譯。
我是不是完全誤解了這一點?那么代碼庫到底有什么意義呢?提供代碼庫似乎有很多額外的工作和要求
謝謝
推薦答案
假設您只向客戶端提供接口,而實現將位于給定的代碼庫中。然后,客戶端請求服務器發送給定的對象,客戶端期望接收實現給定接口的對象,但客戶端不知道實際的實現,當它反序列化發送的對象時,它必須轉到代碼庫并為實際傳遞的對象下載相應的實現類。
這將使客戶端變得非常瘦,并且您將非常容易地更新代碼庫中的類,而不必更新每個客戶端。
編輯
假設您有一個具有以下接口的RMI服務器
public interface MiddleEarth {
public List<Creature> getAllCreatures();
}
客戶端將只有MiddleEarth
和Creature
的接口,而類路徑中沒有任何實現。
其中Creature
的實現是Elf
、Man
、Dwarf
和Hobbit
類型的可序列化對象。并且這些實現位于您的代碼庫中,而不是您的客戶端的類路徑中。
當您請求RMI服務器向您發送中土世界所有生物的列表時,它將發送實現Creature
的對象,即上面列出的任何類。
當客戶端接收到序列化對象時,它必須查找類文件以對其進行反序列化,但這些文件不在本地類路徑中。該流中的每個對象都帶有給定的代碼庫,可用于查找缺少的類。因此,客戶端求助于代碼庫來查找這些類。在那里它將找到正在使用的實際生物類。
代碼庫是雙向工作的,因此這意味著如果您向服務器發送Creature
(即anEnt
),它也會在代碼庫中查找它。
這意味著當客戶端和服務器都需要發布新類型的生物時,他們所要做的就是更新代碼庫中的creaturesImpl.jar
,而不是服務器或客戶端應用程序本身。
這篇關于Java RMI中的代碼庫到底有什么意義?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,