* 反射和反序列化可以破解除了列舉之外的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...