摘要:之前利用反射也是改變了類中的變量。單例模式的類測試類這個類中我打印了和的用來驗證是不是同一個對象。利用反射機制破壞單例模式單例模式的類仍然不變。
簡介
利用反射機制破壞了單例模式,這里以懶漢單例模式為例子進行操作。
之前利用反射也是改變了類中的private變量。
類中的private變量真的private么?
這里采用了懶漢的單例模式,順帶說一句我自己對懶漢餓漢的理解:
懶漢就是在類加載的時候并不創(chuàng)建對象的實例,在你用到的時候才去創(chuàng)建一個實例。
餓漢就是不管你用不用到,這個類加載的時候就創(chuàng)建了一個實例。用到的時候就返回那個已經(jīng)創(chuàng)建好的實例。
根本的區(qū)別在于創(chuàng)建實例的時機不同。
單例模式的類:
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()); } }
輸出結(jié)果如下:
s1 hashCode: 18262862 s2 hashCode: 18262862 s3 hashCode: 28420709
可以看到s3和s1s2已經(jīng)不是同一個實例了。
就這樣,成功的破壞了單例模式。
還是一樣,希望聽到大家對java封裝和反射等的理解。
相信能從大家的評論中學(xué)會很多。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64509.html
摘要:內(nèi)容簡介利用反射機制修改類中的修飾的變量當然,在沒有提供的情況下。利用反射機制破壞單例模式正文首先,我們有一個包含類型變量的類。所以我們做以下修改新增的代碼于是輸出的結(jié)果如下至此,我們已經(jīng)成功的修改了類中的變量的內(nèi)容。 內(nèi)容簡介 利用反射機制修改類中的private修飾的變量(當然,在沒有提供setter的情況下)。 本篇主要講述了如何利用反射機制修改類中的一個private變量。...
摘要:單例模式是一種常用的設(shè)計模式也可能是設(shè)計模式中代碼量最少的設(shè)計模式。簡介單例模式屬于中設(shè)計模式中的創(chuàng)建型模式定義是確保某一個類只有一個實例并提供一個全局的訪問點。 單例模式是一種常用的設(shè)計模式、也可能是設(shè)計模式中代碼量最少的設(shè)計模式。但是少并不意味著簡單、想要用好、用對單例、就的費一番腦子了。因為它里面涉及到了很多Java底層的知識如類裝載機制、Java內(nèi)存模型、volatile等知識...
摘要:反射攻擊首先我們來看一下反射調(diào)用,以雙重檢驗方式為例反射攻擊輸出結(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); 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點?!仙S斯理 ...
摘要:當我們的需求出現(xiàn)變動時,工廠模式會需要進行相應(yīng)的變化??偨Y(jié)來說,要想成功進行一次阿里巴巴的面試,你需要了解甚至掌握以下內(nèi)容語言,尤其是線程原理數(shù)據(jù)庫事務(wù),加鎖,重點分布式設(shè)計模式可以說是涉及范圍非常廣了。 showImg(https://segmentfault.com/img/bV8cSY?w=576&h=432); 前言 今天本是一個陽光明媚,鳥語花香的日子。于是我決定在逛街中感受...
閱讀 1200·2021-10-15 09:39
閱讀 3098·2021-09-10 10:50
閱讀 3482·2019-08-30 15:53
閱讀 1909·2019-08-30 15:52
閱讀 2593·2019-08-29 15:31
閱讀 2000·2019-08-26 13:43
閱讀 2623·2019-08-26 13:37
閱讀 1470·2019-08-23 18:31