單例模式的實現是將構造私有化,然後內部維護乙個物件,但是還是可以通過暴力反射建立多個例項,**如下:
我以上篇文章講的靜態內部類方式實現單例模式為例:
**:
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 修飾,防止外部類訪問,但是反射方法訪問,不受限制...