第五章詳細定義了實現遠程對象所需的服務器端接口與類,涵蓋對象導出、生命周期管理、安全、類加載、Socket 定製、失敗處理、日誌與編譯工具。
抽象類,實現 Remote、Serializable,提供遠程語義的 hashCode、equals、toString:
equals:比較兩個引用是否指向同一遠程對象(而非內容相等,避免遠程調用)hashCode:引用同一底層對象的所有遠程引用返回相同值toString:返回描述遠程引用的字符串(含對象標識符、主機、端口等)clone:Stub 類聲明為 final 且不實現 Cloneable,不可複製序列化形式:私有 writeObject/readObject 處理遠程引用 ref 域的外部化存儲與恢復。
getClientHost():獲取當前線程活動遠程調用的發起主機名setLog(OutputStream) / getLog():設置/獲取 RMI 調用日誌流特徵:引用僅在創建進程生命期內有效,TCP 傳輸,流協議通訊。
(int port):指定端口導出(port, csf, ssf):自定義客戶端/服務端 Socket 工廠exportObject 方法:導出非繼承 UnicastRemoteObject 的實現關鍵規則:對象作為參數/返回值傳遞前必須導出,否則拋出 StubNotFoundException。導出後返回 Stub 替代對象傳遞。
unexportObject(obj, force):取消導出,force=true 強制斷開進行中調用public interface Unreferenced {
public void unreferenced();
}
實現此接口的遠程對象在無客戶端引用時收到通知。RMI 維護每個遠程對象的客戶端 JVM 引用集合,集合為空時調用 unreferenced()(可能多次調用)。僅當無本地與遠程引用時才真正回收。
覆蓋 checkPackageAccess。若未設置 SecurityManager,僅允許從本地類路徑加載 Stub/類,防止遠程下載代碼侵害。
提供靜態方法支持動態類加載,不可實例化。核心方法:
getClassAnnotation(Class):返回 codebase URL 路徑(空格分隔),供註解類描述符loadClass(String name) / loadClass(String codebase, String name) / loadClass(URL codebase, String name):加載類加載邏輯:使用當前線程上下文類加載器為父,維護 (父加載器, codebase) 到 URLClassLoader 的映射表。有 SecurityManager 時需擁有連接所有 codebase URL 權限;無 SecurityManager 時忽略 codebase 僅本地加載。
僅供 JDK 1.1 內部 RMI 實現使用。
createSocket/createServerSocket,默認實現 HTTP 穿透防火牆JDK 1.2 新增工廠接口支援協議定製。使用自定義工廠導出的對象,其 RemoteRef/ServerRef 為 UnicastRef2/UnicastServerRef2,端點線表示含格式字節支持擴展(可攜帶序列化的 ClientSocketFactory)。舊版導出對象保持兼容性(UnicastRef,舊線表示)。
public interface RMIFailureHandler {
public boolean failure(Exception ex);
}
創建 ServerSocket 失敗時調用(非首次導出時)。返回 true 重試,false 放棄。默認處理器返回 false。首次導出失敗不調用此處理器。
內部用於記錄服務器調用錯誤。提供日誌等級常量:SILENT=0、BRIEF=10、VERBOSE=20。支持多日誌、默認流、輸出流設置、行緩衝寫入。
按遠程對象實現類全名生成 Stub/Skeleton。關鍵選項:
-v1.1:JDK 1.1 協議-vcompat(默認):兼容 1.1/1.2-v1.2:僅 1.2 協議(無 Skeleton)-keepgenerated:保留生成的 Java 源文件javac 選項(除 -O)