2011-05-09 55 views
5

我讓用戶使用URLClassLoader從遠程位置導入類似插件的類,因此這些導入的類不存在於構建路徑中(但是,它們全部實現了包含在內的接口IPlugin)。等同於ObjectOutputStream,不僅保存其狀態,還保存整個對象?

我假設可以簡單地使用ObjectOutputStream將所有加載的插件保存到文件中,然後使用ObjectInputStream讀取這些插件。這似乎並不是這種情況,因爲它保存的只是對象的狀態,而不是包含的邏輯(即方法)。

什麼我希望做是爲了節省加載的插件(activePlugins)與ObjectOutputStream的名單:

ObjectOutputStream oos = new ObjectOutputStream(*fileoutputstream*); 
oos.writeObject(activePlugins); 
oos.close(); 
在另一個運行時

然後,負載/恢復所有的這些插件與ObjectInputStream的:

ObjectInputStream ois = new ObjectInputStream(*fileinputstream*); 
activePlugins = (ArrayList<IPlugin>) ois.readObject(); 

但是由於實際的對象類在構建路徑中不可用(它們位於硬盤上的其他位置),因此它會出現故障。我所追求的是某種加載對象的方式,而不需要可用的類,即加載具有狀態和沒有依賴關係的對象。

+0

您還必須序列化流中的類字節。您可以通過'getResourceAsStream'獲取類字節,然後在另一端使用這些字節在自定義類加載器中加載類,然後將結果類轉換爲接口,並通過接口使用該對象。 – MeBigFatGuy 2011-05-09 17:20:28

回答

4

你需要你自己的類加載器。你基本上想要類似於URLClassLoader的東西,但能夠在本地下載和緩存jar。你可能想看看擴展URLClassLoader或者實現類似的東西。你基本上只需要鉤入jar下載的部分,並將其粘貼到本地的某個地方(或者如果你之前已經下載過,則從該緩存的位置加載它)。

+2

我一直在看這個問題幾分鐘。起初他無法理解這個問題,因爲他談論的是狀態和方法。我認爲這聽起來像他實際上都想有一個自定義類加載器(NetworkClassLoader)和ObjectOutputStream。聽起來他想要保存插件的狀態,而不僅僅是插件。或者我現在完全離開地圖? – Kaj 2011-05-09 17:06:36

+0

好點,我錯過了他實際上_did_想要保存的對象狀態。更新了我的答案。 – jtahlborn 2011-05-09 17:20:42

1

看看RMI。這通過類傳遞機制擴展了序列化,所以你可以序列化和反序列化(在接收者)未知類的對象,並執行它們的方法。

這是使用一些遠程類加載機制,我認爲。

+1

僅僅爲了加載類而使用RMI聽起來不對。據我所知,他不想執行遠程方法。 – Kaj 2011-05-09 17:14:47

+0

RMI使用Java Serialization的註釋工具鏈接到代碼的URL(儘管它可以關閉)。 – 2011-05-09 19:54:30

0

Altought Java不是我的主要編程框架,我在其他「框架」(如PHP,Delphi和C#)中看到過相同的問題。

一種解決方案是聲明類文件&路徑。

另一個建議是,既然你指定了,你不關心邏輯,只關心(「數據」)狀態,你可以聲明一個存儲屬性值的泛型類。