成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

MartinDai / 476人閱讀

摘要:枚舉單例以上是一個(gè)單例枚舉的例子,而我們要獲取該實(shí)例只需要,并且此種方式可以保證該單例線程安全防反射攻擊防止序列化生成新的實(shí)例。

關(guān)于單例模式,相信大家都所有了解,比較經(jīng)典的實(shí)現(xiàn)有餓漢式、借助內(nèi)部類、雙重鎖檢測(cè),這些實(shí)現(xiàn)可以保證線程安全,但是在某些特殊情況下并不能夠保證僅僅只有一個(gè)單例,因?yàn)橄裥蛄谢⒎瓷涔舻韧梢陨尚碌膶?shí)例對(duì)象,本文將重點(diǎn)分析枚舉單例模式如何防止反射攻擊。

枚舉單例:

public enum Singleton {
    INSTANCE {

        @Override
        protected void read() {
            System.out.println("read");
        }

        @Override
        protected void write() {
            System.out.println("write");
        }

    };
    protected abstract void read();
    protected abstract void write();
}

以上是一個(gè)單例枚舉的例子,而我們要獲取該實(shí)例只需要Singleton.INSTANCE,并且此種方式可以保證該單例線程安全、防反射攻擊、防止序列化生成新的實(shí)例。

枚舉單例關(guān)于防反射攻擊,當(dāng)然和枚舉的實(shí)現(xiàn)有關(guān),枚舉也是java類,我們對(duì)Singleton的class進(jìn)行反編譯,可以得到一個(gè)新的類(對(duì)于枚舉的實(shí)現(xiàn)不了解的可以補(bǔ)補(bǔ)相關(guān)知識(shí)):

反編譯后的類:

public abstract class Singleton extends Enum
{

    private Singleton(String s, int i)
    {
        super(s, i);
    }

    protected abstract void read();

    protected abstract void write();

    public static Singleton[] values()
    {
        Singleton asingleton[];
        int i;
        Singleton asingleton1[];
        System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i);
        return asingleton1;
    }

    public static Singleton valueOf(String s)
    {
        return (Singleton)Enum.valueOf(singleton/Singleton, s);
    }

    Singleton(String s, int i, Singleton singleton)
    {
        this(s, i);
    }

    public static final Singleton INSTANCE;
    private static final Singleton ENUM$VALUES[];

    static 
    {
        INSTANCE = new Singleton("INSTANCE", 0) {

            protected void read()
            {
                System.out.println("read");
            }

            protected void write()
            {
                System.out.println("write");
            }

        };
        ENUM$VALUES = (new Singleton[] {
            INSTANCE
        });
    }
}

看到了這個(gè)類的真身過后,相信很多人對(duì)于枚舉單例防反射的的原理就了解了:

類的修飾abstract,所以沒法實(shí)例化,反射也無能為力。

關(guān)于線程安全的保證,其實(shí)是通過類加載機(jī)制來保證的,我們看看INSTANCE的實(shí)例化時(shí)機(jī),是在static塊中,JVM加載類的過程顯然是線程安全的。

對(duì)于防止反序列化生成新實(shí)例的問題還不是很明白,一般的方法我們會(huì)在該類中添加上如下方法,不過枚舉中也沒有顯示的寫明該方法。

    //readResolve to prevent another instance of Singleton
    private Object readResolve(){
        return INSTANCE;
    }

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/64156.html

相關(guān)文章

  • 設(shè)計(jì)模式單例模式

    摘要:反射攻擊首先我們來看一下反射調(diào)用,以雙重檢驗(yàn)方式為例反射攻擊輸出結(jié)果是反射攻擊結(jié)果私有構(gòu)造方法被調(diào)用次私有構(gòu)造方法被調(diào)用次從結(jié)果可以看到,私有的構(gòu)造函數(shù)被調(diào)用了兩次,也就是說這樣的單例模式并不安全。 showImg(https://segmentfault.com/img/bV1fer?w=900&h=500); 保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)?!仙S斯理 ...

    cnsworder 評(píng)論0 收藏0
  • 設(shè)計(jì)模式單例模式

    摘要:?jiǎn)卫J疥P(guān)注的重點(diǎn)私有構(gòu)造器線程安全延遲加載序列化和反序列化安全反射攻擊安全相關(guān)設(shè)計(jì)模式單例模式和工廠模式工廠類可以設(shè)計(jì)成單例模式。 0x01.定義與類型 定義:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn) 類型:創(chuàng)建型 UML showImg(https://segmentfault.com/img/bVbtDJ2?w=402&h=268); 單例模式的基本要素 私有的構(gòu)造方...

    陸斌 評(píng)論0 收藏0
  • 面試官所認(rèn)為的單例模式

    摘要:防止指令重排序防止時(shí)指令重排序?qū)е缕渌€程獲取到未初始化完的對(duì)象。枚舉類默認(rèn)枚舉實(shí)例的創(chuàng)建是線程安全的,所以不需要擔(dān)心線程安全的問題。 單例模式是23種GOF模式中最簡(jiǎn)單,也是最經(jīng)常出現(xiàn)的一種設(shè)計(jì)模式,也是面試官最常愛考的一種模式,為什么呢?因?yàn)閱卫J阶銐蚝?jiǎn)單,編寫一個(gè)單例模式代碼幾分鐘就能搞定,所以設(shè)計(jì)模式中面試官通常會(huì)選取單例模式作為出題。下面把單例模式分幾個(gè)點(diǎn),分別說說哪些地方...

    codeKK 評(píng)論0 收藏0
  • ABAP和Java單例模式的攻防

    摘要:然而我只需要將這個(gè)單例類的構(gòu)造函數(shù)通過反射設(shè)置成可以訪問,然后就能通過反射調(diào)用該構(gòu)造函數(shù),進(jìn)而生成新的對(duì)象實(shí)例。針對(duì)這種攻擊,一種可行的防御措施是在單例類的構(gòu)造函數(shù)內(nèi)定義一個(gè)布爾變量,初始化為。當(dāng)構(gòu)造函數(shù)執(zhí)行后,該變量被置為。 ABAP CLASS zcl_jerry_singleton DEFINITION PUBLIC FINAL CREATE PRIVATE . PUB...

    alanoddsoff 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<