2010-05-06 107 views
1

是否有方便的方式通過網絡(而不僅僅是實例數據)傳輸對象,包括其代碼(類)?通過網絡傳輸java.lang.reflect.Proxy

不要問我爲什麼要這樣做。這是一個任務。我問了好幾次,如果這真的是他們的意思,並且沒有改變他們的答案,我想他們真的希望我們通過網絡傳輸代碼(而不僅僅是現場數據)。說實話,我不知道爲什麼我們在這項任務中需要一個代理服務器,只要寫一個簡單的課程就可以實現IMO。該任務說我們應該在服務器上實例化代理並將其傳輸給客戶端(是的,他們談論java.lang.reflect.Proxy,他們命名這個類)。由於沒有用於代理的類文件,我無法部署該文件。我想我必須以某種方式讀出生成的代理的字節碼,將其傳輸到客戶端,然後加載它。這完全沒有意義,但這似乎是他們希望我們做的。我不明白爲什麼。

+0

你確定他們不希望你遠程調用代碼嗎?這是對客戶端上的代理的調用,實際上是執行服務器上的代碼並將結果返回給客戶端? – Yishai 2010-05-06 21:39:49

+0

Yishai在這裏可能是正確的 - 代理對象通常用於允許通過線路傳輸請求。我會建議閱讀位於這裏的java.lang.reflect.Proxy java文檔:http://java.sun.com/javase/6/docs/api/java/lang/reflect/Proxy.html – aperkins 2010-05-06 21:41:18

+0

我知道什麼是代理類很適合。另一個演講的練習是寫一個RMI,就像中間件,我真的很喜歡。我寫了自己的序列化框架,網絡傳輸,非常基本的命名,很多使用註釋和反射,以便生成很好的代理等。 在本練習中,主要重點是編寫一個透明覆制的系統,我們必須隱藏事實服務器使用代理進行復制。這個任務確實說明我們必須在服務器上實例化代理,然後代理將被客戶端使用。 – panzi 2010-05-07 02:47:11

回答

1

這是Apache River項目(以前稱爲Jini,當它由Sun運行時)的核心價值主張。

您將需要遠程運行的代碼放在「代碼庫」http服務器上的jar中,然後將代理髮布到查找服務器。 River使用代碼庫URL註釋該代理(這是一個序列化的實例)。當客戶端從查找服務器獲取代理並實例化代理時,代碼庫jar將用於沙盒類加載器中。創建「智能代理」是很常見的,它可以加載一些代碼在客戶端上運行,以管理通信回源服務,或者使用更簡單的代理來進行RMI調用。

河流封裝的技術複雜而深奧。

+0

這的確聽起來像這裏打算做的。 (儘管如此,談到我們的任務,我不明白爲什麼我們應該做這樣的事情,對於任務的靜態設置非常複雜,而且練習的重點完全不同。) – panzi 2010-05-08 12:10:24