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