HelloBean_HomeImpl_WLStubHelloBean_HomeImpl_WLSkeletonHelloBean_EOImplHelloBean_EOImpl_WLStubHelloBean_EOImpl_WLSkeleton客戶端僅需 Hello.class、HelloHome.class。
HelloHome home = (HelloHome) PortableRemoteObject.narrow(
ctx.lookup("Hello"), HelloHome.class);
home.toString() 輸出:HelloBean_HomeImpl_WLStub@18c458
→ 證實 JNDI 回傳的是 Home Stub 實例。
Hello h = home.create();
h.toString() 輸出:HelloBean_EOImpl_WLStub@8fa0d1
→ 證實獲得的是 Remote Stub 實例。
HelloBean_HomeImpl_WLStubhome(實為 Home Stub),呼叫 create()HelloBean_HomeImpl_WLSkeleton 接收HelloBean_HomeImpl.create()HelloBean_HomeImpl,介面:HelloHome,Stub/Skeleton 如上。HelloBean_HomeImpl.create() 呼叫 HelloBean_Impl.ejbCreate()HelloBean_EOImpl_WLStub 實例HelloBean_HomeImpl 是遠端物件,此處它轉身充當 HelloBean_Impl 的本地代理(同在伺服器 JVM,無 RMI 開銷)。HelloBean_EOImpl_WLStub 序列化回傳客戶端(主角從 Home 切換為 Remote)Hello h = home.create(); h.helloWorld();HelloBean_EOImpl_WLStub.helloWorld()HelloBean_EOImpl_WLSkeleton 接收HelloBean_EOImpl.helloWorld()HelloBean_EOImpl。HelloBean_EOImpl 轉身充當 HelloBean_Impl 的本地代理HelloBean_Impl.helloWorld()HelloBean_Impl 繼承 HelloBean(用戶編寫類)伺服器端主要調用類:HelloBean_Impl、HelloBean_HomeImpl、HelloBean_HomeImpl_WLSkeleton、HelloBean_EOImpl、HelloBean_EOImpl_WLSkeleton
客戶端主要調用類:HelloBean_HomeImpl_WLStub、HelloBean_EOImpl_WLStub(代碼中不直接出現,透過介面操作,Stub 由伺服器下發)
EJB 以雙重 RMI 循環分離「尋找/建立」與「商業呼叫」關注點,容器實作類雙重身份(遠端物件與本地代理)消除分散式開銷,動態 Stub 下發簡化客戶端部署。這是分散式元件架構的經典範式。