摘要:之前利用反射也是改變了類中的變量。單例模式的類測(cè)試類這個(gè)類中我打印了和的用來驗(yàn)證是不是同一個(gè)對(duì)象。利用反射機(jī)制破壞單例模式單例模式的類仍然不變。
簡(jiǎn)介
利用反射機(jī)制破壞了單例模式,這里以懶漢單例模式為例子進(jìn)行操作。
之前利用反射也是改變了類中的private變量。
類中的private變量真的private么?
這里采用了懶漢的單例模式,順帶說一句我自己對(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
摘要:內(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變量。...
摘要:?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í)...
摘要:反射攻擊首先我們來看一下反射調(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斯理 ...
摘要:當(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è)陽光明媚,鳥語花香的日子。于是我決定在逛街中感受...
閱讀 1272·2021-10-15 09:39
閱讀 3176·2021-09-10 10:50
閱讀 3533·2019-08-30 15:53
閱讀 1964·2019-08-30 15:52
閱讀 2633·2019-08-29 15:31
閱讀 2043·2019-08-26 13:43
閱讀 2662·2019-08-26 13:37
閱讀 1511·2019-08-23 18:31