反射和反序列化破解單例模式以及解決方案

2021-09-13 19:05:29 字數 1185 閱讀 3173

*  反射和反序列化可以破解除了列舉之外的4種實現方式。
反射破解單例:

testdcl dcl1 = testdcl.getinstance();

testdcl dcl2 = testdcl.getinstance();

system.out.println(dcl1);

system.out.println(dcl2);

//反射破解單例 兩個不一樣

classc = (class) class.forname("cn.oyh.thread.testdcl");

constructorcon =c.getdeclaredconstructor();

con.setaccessible(true);

testdcl dcl3 = con.newinstance();

testdcl dcl4 = con.newinstance();

system.out.println(dcl3);

system.out.println(dcl4);

上面的testdcl在這裡可以找到,執行:

cn.oyh.thread.testdcl@1540e19d

cn.oyh.thread.testdcl@1540e19d

cn.oyh.thread.testdcl@677327b6

cn.oyh.thread.testdcl@14ae5a5

會發現後面兩個反射建立的物件和上面兩個都不相同,單例模式是對外只有乙個物件。那麼怎麼破解呢?很簡單:

//1.構造器私有化

private testdcl()

}

在構造器這改下**就行了,在執行,會丟擲異常。

反序列化破解單例:

也就是把單例模式反序列化,那麼需要實現serializable介面:

public class testdcl implements serializable
執行:

cn.oyh.thread.testdcl@1540e19d

cn.oyh.thread.testdcl@1540e19d

cn.oyh.thread.testdcl@1540e19d

序列化和反序列化破壞單例模式的解決方法

我們知道單利模式可以確保在系統中只存在唯一例項,不過當序列化遇到單例時,裡邊就有了個問題 從記憶體讀出而組裝的物件破壞了單例的規則。為了解決這個問題提供一下兩種解決方案 單利類1 public class singleton implements serializable private stati...

建立者模式 單例模式 反射 序列化

實現方式 構造器私有,提供乙個外部可以訪問的方法 可以提供例項 1 餓漢式 執行緒安全,呼叫效率高,不能延時載入 2 懶漢式 執行緒安全,呼叫效率不高,可以延時載入 要用的時候才載入 3 雙重鎖檢測式 由於jvm底層內部模型原因,偶爾會出現問題,不建議使用 4 靜態內部類式 執行緒安全,呼叫效率高,...

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...