單例模式的漏洞,通過反射和序列化、反序列化來破解單例,以及如何避免這些漏洞


(一)單例模式(以餓漢式為例)

   首先的話,看下面的代碼:

    

 

 

(二)通過反射來破解單例模式

    在看下面的代碼

    

      看運行的結果:

      說明:打印出來的結果不一樣,說明這2個對象就是不同的對象,這樣就破解了單例模式

(三)通過序列化和反序列化破解單例

   

      看運行效果:

    

       說明:打印出來的結果不一樣,說明這2個對象就是不同的對象,這樣就破解了單例模式

(四)如何避免這些漏洞

  (1)避免反射

   說明:反射是通過它的Class對象來調用構造器創建出新的對象,我們只需要在構造器中手動拋出異常,導致程序停止就可以達到目的了,看下面代碼:

    

      看運行效果:

    

      說明:這樣就避免通過反射來調用構造器來破解單例

  (2)避免序列化

    看下面代碼:

    

      運行效果:

 

        說明:這個方法是基於回調的,反序列化時,如果定義了readResolve()則直接返回此方法指定的對象,而不需要在創建新的對象!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM