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

2021-06-28 00:41:20 字數 1147 閱讀 3500

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

列舉單例:

public enum singleton 

@override

protected void write()

};protected abstract void read();

protected abstract void write();

}

以上是乙個單例列舉的例子,而我們要獲取該例項只需要singleton.instance,並且此種方式可以保證該單例執行緒安全、防反射攻擊、防止序列化生成新的例項

反編譯後的類:

public abstract class singleton extends enum

protected abstract void read();

protected abstract void write();

public static singleton values()

public static singleton valueof(string s)

singleton(string s, int i, singleton singleton)

public static final singleton instance;

private static final singleton enum$values;

static

protected void write()

};enum$values = (new singleton );

}}

看到了這個類的真身過後,相信很多人對於列舉單例防反射的的原理就了解了:

//readresolve to prevent another instance of singleton

private object readresolve()

如果寫的有問題,歡迎指正~

單例 反射 列舉

單例模式 構造方法私有 提供公開的靜態方法返回該類唯一的例項 反射 jvm在進行類載入時,會產生類對應的類物件 類物件 包含了乙個類所有資訊的物件 類的物件 根據類的類物件包含的資訊建立出來的物件 jvm拿到類物件可以建立類的物件 訪問屬性 呼叫方法 所有的類物件都是class型別的物件,該型別的物...

防止利用暴力反射破壞單例模式

單例模式的實現是將構造私有化,然後內部維護乙個物件,但是還是可以通過暴力反射建立多個例項,如下 我以上篇文章講的靜態內部類方式實現單例模式為例 package com.hy.practice import sun.security.jca.getinstance author hy classnam...

單例模式之列舉單例

列舉也是餓漢式。列舉單例 問題1 列舉單例是如何限制例項個數的 反編譯後可以看到 就是我們列舉類的乙個靜態成員變數而已,單例項的 問題2 列舉單例在建立時是否有併發問題 沒有,因為它也是靜態成員變數,它的執行緒安全性也是在類載入階段完成的。那個時候不會有執行緒併發問題 問題3 列舉單例能否被反射破壞...