国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用反射機制破壞單例模式

luodongseu / 3010人閱讀

摘要:之前利用反射也是改變了類中的變量。單例模式的類測試類這個類中我打印了和的用來驗證是不是同一個對象。利用反射機制破壞單例模式單例模式的類仍然不變。

簡介

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

正常的單例模式的實現

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

單例模式的類:

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

測試類:

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());
    }
}

這個類中我打印了s1和s2的hashCode用來驗證是不是同一個對象。
輸出如下:

s1 hashCode: 2943240
s2 hashCode: 2943240

可以看到s1和s2其實是同一個實例。

利用反射機制破壞單例模式

單例模式的類仍然不變。

測試類如下:

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());
    }
}

輸出結果如下:

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

可以看到s3和s1s2已經不是同一個實例了。

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

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

相信能從大家的評論中學會很多。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64509.html

相關文章

  • 類中private變量真的private么?

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

    stormjun 評論0 收藏0
  • 設計模式|徹底理解單列模式

    摘要:單例模式是一種常用的設計模式也可能是設計模式中代碼量最少的設計模式。簡介單例模式屬于中設計模式中的創建型模式定義是確保某一個類只有一個實例并提供一個全局的訪問點。 單例模式是一種常用的設計模式、也可能是設計模式中代碼量最少的設計模式。但是少并不意味著簡單、想要用好、用對單例、就的費一番腦子了。因為它里面涉及到了很多Java底層的知識如類裝載機制、Java內存模型、volatile等知識...

    li21 評論0 收藏0
  • 設計模式單例模式

    摘要:反射攻擊首先我們來看一下反射調用,以雙重檢驗方式為例反射攻擊輸出結果是反射攻擊結果私有構造方法被調用次私有構造方法被調用次從結果可以看到,私有的構造函數被調用了兩次,也就是說這樣的單例模式并不安全。 showImg(https://segmentfault.com/img/bV1fer?w=900&h=500); 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。——艾迪生維斯理 ...

    cnsworder 評論0 收藏0
  • 記一次慘烈的阿里面試經歷

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

    Eastboat 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<