防止利用暴力反射破壞單例模式

2021-10-14 09:47:55 字數 2270 閱讀 9580

單例模式的實現是將構造私有化,然後內部維護乙個物件,但是還是可以通過暴力反射建立多個例項,**如下:

我以上篇文章講的靜態內部類方式實現單例模式為例:

**:

package com.hy.practice;

import sun.security.jca.getinstance;

/** * @author hy

* @classname userservice

* @description 靜態內部類

* @datetime 2020/12/27 10:45

* version 1.0

*/public

class

userservice

private

static

class

innerclass

public

static userservice getinstance()

}

暴力反射建立多個物件:

class<

?> aclass = class.

forname

("com.hy.practice.userservice");

constructor<

?> constructor = aclass.

getdeclaredconstructor()

; constructor.

setaccessible

(true);

object o1 = constructor.

newinstance()

; object o2 = constructor.

newinstance()

; system.out.

println

(o1)

; system.out.

println

(o2)

;

輸出:

可以看到,通過暴力反射可以呼叫私有的構造方法進行多次例項化,解決辦法就是在私有構造方法裡面判斷一下物件是否有例項。

**:

package com.hy.practice;

import sun.security.jca.getinstance;

/** * @author hy

* @classname userservice

* @description 靜態內部類

* @datetime 2020/12/27 10:45

* version 1.0

*/public

class

userservice

//沒有就讓他用一次

getinstance()

;}private

static

class

innerclass

public

static userservice getinstance()

}

測試**:

class<

?> aclass = class.

forname

("com.hy.practice.userservice");

constructor<

?> constructor = aclass.

getdeclaredconstructor()

; constructor.

setaccessible

(true);

object o1 = constructor.

newinstance()

; system.out.

println

(o1)

; object o2 = constructor.

newinstance()

; system.out.

println

(o2)

;

輸出結果:

可以看到第一次呼叫沒有問題,第二次呼叫就報錯了,所以就解決了此問題

C 反射破壞單例

單例大家都不陌生,程式從開啟到死亡過程中只能存在乙個例項,即存在不可建立,今天給大家介紹一種打破這種模式的方法,在程式執行中建立無數個單例例項物件。關於單例模式模糊或者不懂的可以參考c 單例模式 上文我們講到了反射的基本操作,例項化物件 屬性 方法 特性等操作,可以參考c 反射 咱們切入正題,單例有...

單例模式的破壞及任何防止被破壞

常用的單例模式有懶漢式 餓漢式兩種情況。實際的應用場景也是很常見,好比如資料庫連線池的設計,還有windows的task manager 任務管理器 等。所謂單例模式就是,某乙個類只能有乙個例項,實現的核心就是將類的建構函式私有化,只能由該類建立物件,其他物件就不能呼叫該類的建構函式,即不能建立物件...

反射機制會破壞單例模式嘛

現在已經標準的實現了單例模式 單檢查鎖,雙檢查鎖,列舉 如果我們通過反射機制呼叫,是否會產生多個例項,即破壞了單例模式。反射模式,呼叫方法是不會破壞單例模式,因為反射方法同樣受鎖 邏輯的保護。呼叫建構函式會破壞單例模式,因為構造方法只是private 修飾,防止外部類訪問,但是反射方法訪問,不受限制...