在Java中,我們可以通過sun.reflect.ReflectionFactor.newConstructorForSerialization()來檢索一個構造函數,而無需實際調用已聲明的構造函數,從而創建一個類的實例。爲什麼ReflectionFactor.newConstructorForSerialization()返回的構造函數名爲「munged」?
據我所知,這個特殊的構造函數被稱爲「munged」。這個詞來自哪裏?我無法在任何字典中找到它。
在Java中,我們可以通過sun.reflect.ReflectionFactor.newConstructorForSerialization()來檢索一個構造函數,而無需實際調用已聲明的構造函數,從而創建一個類的實例。爲什麼ReflectionFactor.newConstructorForSerialization()返回的構造函數名爲「munged」?
據我所知,這個特殊的構造函數被稱爲「munged」。這個詞來自哪裏?我無法在任何字典中找到它。
我相信這是作爲在下面的意義,因爲你不知何故繞過/僞裝正常的對象的創建週期,通過跳過構造:
(計算)修改或僞造電子郵件 (或其他互聯網)地址,所以 不能自動收穫, 尤其。以避免垃圾郵件機器人
(計算)更改文件;使 不可撤銷的變化,破壞, 混淆
兩個定義從普林斯頓的共發現。
從維基:
爲deserialisation並不[一定]調用父類的構造函數,而不是原始類的部分構造函數。從JVM規範的角度來看,這是非法的 - 一個合法構造函數的一個徹底版本。
此外,來自軟件包sun。*的類不應直接使用,因爲它們可能無法在其他JDK實現上使用(所以此「構造函數」可能與其他JDK未定義)。
你可以使用objenesis:http: //code.google.com/p/objenesis/ 有些情況下,您必須繞過構造函數: *序列化,遠程處理和持久性 - 對象需要實例化並恢復到特定狀態,而無需調用代碼。 *代理,AOP庫和模擬對象 - 類可以被分類而不需要擔心super()構造函數。 *容器框架 - 可以以非標準方式動態地實現對象的對象。 (摘自上面的網站。) – Martin 2009-09-15 10:13:50
你爲什麼認爲它被稱爲「消逝」?我從來沒有聽說過這個,你有手嗎? – 2009-09-15 09:25:30
http://svn.xstream.codehaus.org/browse/xstream/trunk/xstream/src/java/com/thoughtworks/xstream/converters/reflection/Sun14ReflectionProvider.java?r=HEAD – Martin 2009-09-15 10:20:20