單例模式 反射攻擊的解決方案及原理分析

2022-08-21 20:12:08 字數 904 閱讀 9325

首先我們還是拿餓漢模式作為栗子進行測試,餓漢模式的**如下:

public class hungrysingleton implements serializable 

private hungrysingleton()

public static hungrysingleton getinstance()

private object readresolve()

1、先寫乙個利用反射獲取例項的方法和直接獲取例項的方法,將兩者的返回值進行比較,看返回的是否是乙個例項。

**如下:

public class testreflection 

}

執行後的結果為:可見,兩者的結果並不是乙個物件,則餓漢模式毅然受到了反射的攻擊。

2、那麼改如何解決這反射攻擊呢?我們知道是在類載入的時候就載入了這個例項的,因為是在類載入的時候就生成了詞例項,那麼我們可以在構造器裡面加乙個判斷,進行反射防禦。**如下:

測試結果為:

這種方式有乙個特點,也就是它對類載入這個時刻就把物件建立好的這種類是ok的,靜態內部類的單例也可以用。
對於不是靜態類的也需要解決下,要根據建立例項的順序進行解決。但是無論如何反射都可以訪問到類的方法和變數,進行修改,所以非
類載入這個時刻就把物件建立好的這種類,是不能防止反射攻擊的。

反射攻擊解決方案及原理分析

反射可以通過修改私有構造器的訪問許可權,或者修改單例類的某些屬性值,來獲取新的例項,從而破壞單例模式。public class test 輸出結果 designmodel.singleton.hungrysingleton 61bbe9ba designmodel.singleton.hungrys...

列舉單例模式如何防止反射攻擊

關於單例模式,相信大家都所有了解,比較經典的實現有餓漢式 借助內部類 雙重鎖檢測,這些實現可以保證執行緒安全,但是在某些特殊情況下並不能夠保證僅僅只有乙個單例,因為像序列化 反射攻擊等往往可以生成新的例項物件,本文將重點分析列舉單例模式如何防止反射攻擊。列舉單例 public enum single...

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

反射和反序列化可以破解除了列舉之外的4種實現方式。反射破解單例 testdcl dcl1 testdcl.getinstance testdcl dcl2 testdcl.getinstance system.out.println dcl1 system.out.println dcl2 反射破解...