2017-02-28 38 views
1

我需要有一個應用程序,在運行時可以加載其他類和反序列化它的一個實例successfuly,以便它可以運行它的方法和讀取成員變量。加載在Java編譯的類和反序列化它的實例從一個文件

從我注意到,你不能序列在Java方法,所以我想在project2序列化類的實例,裝入ClassLoader編譯的類中project1,實例並從porject2project1分配反序列化實例到實例化的加載類。

序列化的類將繼承這兩個項目相同的父類。

這是最好的方法嗎?這是一個學校項目,所以要求我的應用程序可以接受任何其他類的類而不更改代碼。

TL; DR:我的計劃是使用ClassLoader加載一個已編譯的類,以便我的項目知道該類(特別是裏面的方法),然後在項目中加載該序列化的類實例,以便獲取數據從實例和加載的類(現在我知道方法),在反序列化的實例上運行方法。

+0

謝謝;並表示感謝;-) – GhostCat

回答

2

你錯了。在一些對象上調用方法的能力與序列號的所有無關。

我的意思是:該方法的實現是而不是部分序列化的數據! Java序列化僅將字段數據寫入該輸出流。

的方法實施依賴於文件中的一些Java類。您可以序列化和經常你要反序列化對象 - 但什麼,當你調用一個方法這樣的對象上發生的事情是由相應的類加載器加載你,當第一訪問相應的類文件確定類。

如果你的目標是真的只是「一類轉儲的對象爲二進制表示」;另一段代碼加載該二進制數據;把它變成一個物體;訪問該對象;那麼你做不是需要兩個項目。你也不需要擔心「那裏的方法」。只要你的ClassLoader 知道即將被反序列化的對象的類,一切都會正常工作。只需選擇一個示例教程,如here並完成它。

但是:您的要求的時候是調用方法或任意對象的訪問領域;那麼你不需要考慮序列化,而是考慮到Java reflection

但警告存在的一句話:反射聽起來很容易,但請放心:有很多很多辦法讓你寫略有錯誤的代碼。由於反射基本上是一個運行時的事情,Java編譯器沒有多大幫助。你編寫看起來合理的代碼,編譯代碼,運行代碼,並且你會遇到異常。

從這個意義上說,反思是Java課程中的高級主題;我想你應該退後一步並向老師澄清他們對你的期望。

鑑於您的最新更新:然後只需查看有關序列化的教程(並忘記反射部分)。並回答你的問題:是的,這聽起來像一個可行的方法。不能多說;因爲你到目前爲止沒有分享代碼。

+0

嗨。我的計劃是使用ClassLoader加載一個編譯後的類,以便我的項目知道該類(特別是裏面的方法),然後在項目中加載該序列化的類實例,以便可以從實例中獲取數據,並與加載的類(現在我也知道方法),在反序列化的實例上運行這些方法。我編輯了我的問題,我想說「加載另一個類並反序列化它的一個實例」 –

+0

查看我的更新。但請理解:我們幫助解決具體問題......從這個意義上說,您的要求實際上太不明確了。 – GhostCat