(一)單例模式(以餓漢式為例)
首先的話,看下面的代碼:
(二)通過反射來破解單例模式
在看下面的代碼
看運行的結果:
說明:打印出來的結果不一樣,說明這2個對象就是不同的對象,這樣就破解了單例模式
(三)通過序列化和反序列化破解單例
看運行效果:
說明:打印出來的結果不一樣,說明這2個對象就是不同的對象,這樣就破解了單例模式
(四)如何避免這些漏洞
(1)避免反射
說明:反射是通過它的Class對象來調用構造器創建出新的對象,我們只需要在構造器中手動拋出異常,導致程序停止就可以達到目的了,看下面代碼:
看運行效果:
說明:這樣就避免通過反射來調用構造器來破解單例
(2)避免序列化
看下面代碼:
運行效果:
說明:這個方法是基於回調的,反序列化時,如果定義了readResolve()則直接返回此方法指定的對象,而不需要在創建新的對象!