所以我有一個服務器jvm和一個客戶端jvm。客戶端通過tcp發送序列化的java對象來與服務器通信。現在,服務器通常會在其類路徑中接收對象的類,以正確地反序列化對象。將java類字節碼從jvm移動到jvm
但我正在尋找的是一些方法來避免這種情況;即讓客戶端以某種方式通過線路按需發送類字節碼。這當然需要遞歸類樹(如果原始類的任何成員本身是服務器不知道的其他類的對象)。
所以我想知道任何有這樣的事情的技術。
Thx。
所以我有一個服務器jvm和一個客戶端jvm。客戶端通過tcp發送序列化的java對象來與服務器通信。現在,服務器通常會在其類路徑中接收對象的類,以正確地反序列化對象。將java類字節碼從jvm移動到jvm
但我正在尋找的是一些方法來避免這種情況;即讓客戶端以某種方式通過線路按需發送類字節碼。這當然需要遞歸類樹(如果原始類的任何成員本身是服務器不知道的其他類的對象)。
所以我想知道任何有這樣的事情的技術。
Thx。
RMI has the ability to dynamically download entire class file definitions over the wire on demand。
即使您不使用(或想要使用)RMI,類加載的基礎技術也許是有趣的,它們是標準的Java。
RMI包含「類服務器」的概念。聽起來你幾乎重新發明了這一點,所以考慮考慮使用全部或部分RMI。 Here's一個教程。
RMI默認會這樣做,但我會建議將類文件部署到需要的地方,而不是去尋找某種巧妙的東西。 – 2012-01-16 00:00:34
這聽起來像一個非常糟糕的主意。基本上,這意味着您允許您的客戶端將代碼發送到當前進程內直接執行的服務器。像這樣的東西通常被認爲是一個嚴重的漏洞,即Arbitrary code execution這是你可能遇到的最糟糕的漏洞之一。
建立在此基礎上的系統設計很好,不那麼聰明。
創建一個從流中加載類的類加載器。有關詳細信息,請參閱JarFileClassLoader example。
這當然會變得非常成問題,特別是如果任何類使用反射並且不直接命名字節碼中的實現以及潛在的安全問題;您需要查看安全的類加載器。
如果普通RMI無法滿足您的要求,請查看Java中的移動代理框架(例如Aglets)。
你正在詢問Code Mobility。網格計算領域也有些相關。
看看Mobility-RPC,它是一個庫,它在相同的粒度級別(類級別)上完全符合您的要求。
安全是值得銘記的。但我還記得發送到數據庫的SQL,通過SSH執行的bash命令,業務規則引擎,Adobe Flash,Java Applets,如上所述的RMI,ActiveX,JavaScript,Hadoop /網格計算框架 - 所有這些都是遠程示例代碼執行廣泛使用。像所有事情一樣,將安全撥號轉到最大限度會限制您的選擇。但是,如果適當防火牆或沙箱,以上所有內容均可取得良好效果。
在這種情況下,這聽起來像是你想要消除一些小麻煩,而你沒有(比如說)設計一個完整的分佈式應用程序。因此,根據您所說的話,儘管我自己有點代碼流動性支持者,但我認爲在這種情況下代碼流動性可能是過度的。 (但對別人有用。)
關於網格計算,請看GridGain和Hadoop。 GridGain是一個純粹的(以CPU爲中心的)網格計算框架,而Hadoop更像是一個擁有自己複製的分佈式文件系統(HDFS)的數據挖掘/數據倉庫平臺。
GridGain和Hadoop都將實現任務/作業的用戶定義的Java代碼傳輸到遠程工作節點。上次我檢查時,他們通過將用戶提供的jar文件傳送到相關節點來做到這一點。我認爲GridGain類加載器比Hadoop更復雜(但不如Mobility-RPC的複雜)。 Hadoop基本上爲每項工作啓動一個新的JVM,而不是特別高效(但不完全是IO負載的瓶頸!)。
Mobility-RPC有所不同,因爲它不希望遠程機器完全成爲工作節點,它可能是運行該庫的任何應用程序。所以它更像RPC或專門的任務/對象傳輸。
是的,我們已經有了一個做「rmi」的框架;所以研究底層技術會很有意義。 – Jack 2012-01-21 19:40:05