2009-12-03 71 views
0
  1. 我明白,一旦開發遠程代理包括生成存根/骨架,但今天這已不再需要得益於反思。 (動態代理)

我想得到一個清楚的解釋,爲什麼和如何反射代替這種需要。 例如我明白存根被假設爲處理網絡上的通信(如果遠程對象在另一臺計算機上),再加上負責序列化/反序列化等等......現在誰負責這個工作?遠程和動態代理

也許我得到了動態代理的概念都是錯誤的。

  • 除了我讀到有關的Java和RMI這個問題,我如何實現用C遠程代理++, 我大概可以使用DCOM,有另一種,也許更簡單,方式是什麼? (和我需要存根/骨架DCOM或像Java沒有更多?)
  • 感謝

    回答

    1

    說你有一個interface Aclass B implements A

    服務器虛擬機有一個B實例;它與一個名字相關聯;服務器在TCP端口上偵聽客戶端通信。如下所示:

    Server server = new Server(localhost, port); 
    server.bind("bbbb", new B()); 
    

    在客戶端VM上,要訪問駐留在服務器VM上的B對象。你需要獲得(A型)對它的引用

    A bb = lookup(serverIp, port, "bbbb"); 
    

    bbA一個子類,與java.lang.reflect.Proxy創建。 bb上的任何方法調用均由InvocationHandler處理,該調用以任何方式對調用進行編碼,然後通過電線將其發送到其他服務器。服務器接收到「在名爲bbbb的對象上調用這個名字的方法」的請求,並且服務器用反射來執行該任務沒有問題。那麼返回值以類似的方式發送回客戶端。

    所以你自己做這件事真的不難。 Sun的RMI可能會做同樣的事情(RMI還有一些其他功能,如遠程垃圾收集)。請參見http://java.sun.com/j2se/1.5.0/docs/guide/rmi/relnotes.html

    +0

    我還是不明白它......所以你說InvocationHandler取代了使用存根/骨架? 和反射這裏有什麼不同,沒有像以前那樣反射? – Idan 2009-12-04 13:42:01

    0

    如果我沒有弄錯,殘留/骨架是由rmic工具靜態創建的,而現在整個過程是動態的。

    它不一定就是'更好',但只是消除了編譯存根和骨架的麻煩。在這兩種情況下,請求參數和響應都以相同的級別以相同的方式序列化。

    至於問題1:RMI的一些實現使用Corba,所以如果代碼可用,您可能需要查看該代碼。

    所有你需要的是將你的C++代碼與作爲存根/骨架的Corba層進行接口。