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

資訊專欄INFORMATION COLUMN

利用反射機(jī)制破壞單例模式

luodongseu / 3061人閱讀

摘要:之前利用反射也是改變了類中的變量。單例模式的類測(cè)試類這個(gè)類中我打印了和的用來驗(yàn)證是不是同一個(gè)對(duì)象。利用反射機(jī)制破壞單例模式單例模式的類仍然不變。

簡(jiǎn)介

利用反射機(jī)制破壞了單例模式,這里以懶漢單例模式為例子進(jìn)行操作。
之前利用反射也是改變了類中的private變量。
類中的private變量真的private么?

正常的單例模式的實(shí)現(xiàn)

這里采用了懶漢的單例模式,順帶說一句我自己對(duì)懶漢餓漢的理解:
懶漢就是在類加載的時(shí)候并不創(chuàng)建對(duì)象的實(shí)例,在你用到的時(shí)候才去創(chuàng)建一個(gè)實(shí)例。
餓漢就是不管你用不用到,這個(gè)類加載的時(shí)候就創(chuàng)建了一個(gè)實(shí)例。用到的時(shí)候就返回那個(gè)已經(jīng)創(chuàng)建好的實(shí)例。
根本的區(qū)別在于創(chuàng)建實(shí)例的時(shí)機(jī)不同。

單例模式的類:

public class SingleTest {
    private static SingleTest singleTest;
    private SingleTest(){}
    public static SingleTest getSingleTest()
    {
        if(singleTest==null)
        {
            singleTest = new SingleTest();
        }
        return singleTest;
    }
}

測(cè)試類:

import java.lang.reflect.Field;

public class Test 
{
    
    public static void main(String args[])
    {    
        SingleTest s1 = SingleTest.getSingleTest();
        SingleTest s2 = SingleTest.getSingleTest();
        System.out.println("s1 hashCode: "+s1.hashCode());
        System.out.println("s2 hashCode: "+s2.hashCode());
    }
}

這個(gè)類中我打印了s1和s2的hashCode用來驗(yàn)證是不是同一個(gè)對(duì)象。
輸出如下:

s1 hashCode: 2943240
s2 hashCode: 2943240

可以看到s1和s2其實(shí)是同一個(gè)實(shí)例。

利用反射機(jī)制破壞單例模式

單例模式的類仍然不變。

測(cè)試類如下:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class Test 
{
    
    public static void main(String args[])
    {    
        SingleTest s1 = SingleTest.getSingleTest();
        SingleTest s2 = SingleTest.getSingleTest();
        SingleTest s3 = null;
        System.out.println("s1 hashCode: "+s1.hashCode());
        System.out.println("s2 hashCode: "+s2.hashCode());
        
        Class singleClass = s1.getClass();
        try {
            Constructor constructor = singleClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            s3 = (SingleTest) constructor.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("s3 hashCode: "+s3.hashCode());
    }
}

輸出結(jié)果如下:

s1 hashCode: 18262862
s2 hashCode: 18262862
s3 hashCode: 28420709

可以看到s3和s1s2已經(jīng)不是同一個(gè)實(shí)例了。

就這樣,成功的破壞了單例模式。

還是一樣,希望聽到大家對(duì)java封裝和反射等的理解。

相信能從大家的評(píng)論中學(xué)會(huì)很多。

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

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

相關(guān)文章

  • 類中private變量真的private么?

    摘要:內(nèi)容簡(jiǎn)介利用反射機(jī)制修改類中的修飾的變量當(dāng)然,在沒有提供的情況下。利用反射機(jī)制破壞單例模式正文首先,我們有一個(gè)包含類型變量的類。所以我們做以下修改新增的代碼于是輸出的結(jié)果如下至此,我們已經(jīng)成功的修改了類中的變量的內(nèi)容。 內(nèi)容簡(jiǎn)介 利用反射機(jī)制修改類中的private修飾的變量(當(dāng)然,在沒有提供setter的情況下)。 本篇主要講述了如何利用反射機(jī)制修改類中的一個(gè)private變量。...

    stormjun 評(píng)論0 收藏0
  • 設(shè)計(jì)模式|徹底理解單列模式

    摘要:?jiǎn)卫J绞且环N常用的設(shè)計(jì)模式也可能是設(shè)計(jì)模式中代碼量最少的設(shè)計(jì)模式。簡(jiǎn)介單例模式屬于中設(shè)計(jì)模式中的創(chuàng)建型模式定義是確保某一個(gè)類只有一個(gè)實(shí)例并提供一個(gè)全局的訪問點(diǎn)。 單例模式是一種常用的設(shè)計(jì)模式、也可能是設(shè)計(jì)模式中代碼量最少的設(shè)計(jì)模式。但是少并不意味著簡(jiǎn)單、想要用好、用對(duì)單例、就的費(fèi)一番腦子了。因?yàn)樗锩嫔婕暗搅撕芏郕ava底層的知識(shí)如類裝載機(jī)制、Java內(nèi)存模型、volatile等知識(shí)...

    li21 評(píng)論0 收藏0
  • 設(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
  • 記一次慘烈的阿里面試經(jīng)歷

    摘要:當(dāng)我們的需求出現(xiàn)變動(dòng)時(shí),工廠模式會(huì)需要進(jìn)行相應(yīng)的變化。總結(jié)來說,要想成功進(jìn)行一次阿里巴巴的面試,你需要了解甚至掌握以下內(nèi)容語言,尤其是線程原理數(shù)據(jù)庫事務(wù),加鎖,重點(diǎn)分布式設(shè)計(jì)模式可以說是涉及范圍非常廣了。 showImg(https://segmentfault.com/img/bV8cSY?w=576&h=432); 前言 今天本是一個(gè)陽光明媚,鳥語花香的日子。于是我決定在逛街中感受...

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

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

0條評(píng)論

閱讀需要支付1元查看
<