2011-12-31 20 views
1

據我可以看到,給定一個IFoo界面延伸RemoteFooImpl類實施IFoo,下面的兩個代碼片段是(幾乎)相等的:(1)RMI和引用/代理類

IFoo stub = (IFoo)UnicastRemoteObject.exportObject(new FooImpl()); 
Naming.bind("foo", stub); 

並且,如果是FooImpl延伸UnicastRemoteObject的類:(2)

Naming.bind("foo", new FooImpl()); 

事實上,FooImpl實例出口在隱完成構造函數調用。

但在(1)中,由UnicastRemoteObject.exportObject()返回的對象是Proxy(動態)類,因此記錄在RMI註冊表中的對象顯然是一個參考。而在(2)中,不清楚。

哪裏 Proxy建設基於實現的一個實例 FooImpl

?我已經看到,在客戶端代碼(Naming.bind())RMI註冊表管理封裝了(註冊表)Proxy類的創建與到LocateRegistry.getRegister()通話。因此,在請求:

Naming.bind("foo", new FooImpl()) 

難道是處理擴展Remote把它們轉化爲引用/ Proxy類的參數註冊表Proxy類調​​用處理程序?

在此情況下,考慮到存根Proxy類(1)中本身是一個Remote類,將其意味着存儲在註冊表中的對象是對基準的基準(即Proxy調用另一個Proxy調用真正的課堂)?

謝謝。

回答

2

當FooImpl對象被編組到註冊表中的綁定()調用它是由它的殘餘部分自動替換。作爲一個遠程方法的參數或結果使用時發生任何導出的遠程對象。

+0

感謝。它是否意味着在(1)中,'Naming.bind(「foo」,new FooImpl());'應該優先於'Naming.bind(「foo」,stub);'? – lledr 2012-01-01 10:15:50

+0

@ysomane恰恰相反,它意味着它沒有任何區別。您可能有其他原因希望第二個選擇,例如保留對遠程對象的引用,以便您可以將其導出。 – EJP 2012-01-08 00:50:35