2011-12-14 69 views
3

當RMI(Sun VM中的sun.rmi實現)將對象反序列化時,作爲遠程​​調用參數或返回值的一部分,它需要從類的名稱(序列化數據中的字符串)到一個Class對象。 RMI如何決定使用哪個ClassLoader來定義類?Java RMI如何(在實現級別)加載+定義類?

回答

2

默認情況下,Java反序列化爲第一個非系統類搜索堆棧並使用其類加載器(即第一個非空類加載器)。 RMI爲串行流添加註釋以提供應從何處下載類的位置(URL)。默認情況下,RMI類加載器使用該位置來查找其他類。有一個系統屬性來關閉這種行爲(不是一個壞主意)。

+0

因此,基本上,假設沒有指定遠程代碼庫,返回值由ClassLoader加載,ClassLoader會將調用的Class加載到Stub中? (或者定義特定代理類的類加載器,該存根是一個instanceof)在服務器上怎麼樣?直到UnicastServerRef將實際上調進入導出對象爲止,此時參數已全部反序列化,所有堆棧幀都應該是系統類,因爲它位於RMI的一個調度線程中。對? – jon 2011-12-14 02:47:13