最近在學java, 單例模式的定義是 一個類對應一例(only one class and one instance) 還是 每個類都只有一例(each class has one instance)?
假如說我自己寫了一個類加載器, 然后加載了這個單例類, 那么通過在建構式里邊做點手腳也還是能防止反射的. 我的問題是, 比如我用了兩個不同的類加載器加載了兩遍單例類, 每次都反射到getInstance方法, 然后每個單例類都實體化了一遍, 那這樣就是兩個類有兩個例了, 這符合單例的定義嗎? 如果不符合要怎樣防止這樣的反射呢?
uj5u.com熱心網友回復:
理論上是一個類對應一例,雖然你自定義類加載器多次加載同一個類能到做每個類都只有一例,但是被加載的類在記憶體中屬于不同的類物件。也就是同一個類X由類加載器A中得到Class物件X和類加載器B中得到的Class物件X是不同的,而且互相不可見,所以對于類加載器A來說,ClassX還是單實體(因為它看不到類加載器B的ClassX),同樣的,對于類加載器來說,ClassX也還是單實體。所以這應該還是符合單實體定義的。而且如果沒有用雙親委派來加載類,除了你的自定義類加載器認識你加載的類,其他的類加載器是不認識它的,除非你所有的業務類都在你自定義類加載器里加載,否則其他類加載器加載的業務來要用到你的單實體類,就會拋出找不到類例外。所以就算你通過多個類加載器來多次加載單實體類,影響也不大,同一個類加載器的業務類只能看到自己類加載器加載的單實體類,看不到其他類加載器加載的單實體類,有啥用?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/96040.html
標籤:Java相關
