簡體   English   中英

為什么我可以創建多個具有反射的單例實例?

[英]Why can I create more than one instance of a singleton with reflection?

為什么Java不會阻止您實例化任何單例類對象?

我試圖創建Void類的對象

java.lang.Void

我寫了這段代碼來創建兩個實例

try{
    Class clazz = Void.class;
    Constructor cons = clazz.getDeclaredConstructor();
    cons.setAccessible(true);
    Void s2 = (Void) cons.newInstance(); 
    System.out.println(s2);
    Void s3 = (Void) cons.newInstance(); 
    System.out.println(s3);

}catch (Exception e) {
    e.printStackTrace();
} 

誰能解釋-為什么在Java中允許這樣做?

使用這樣的反射,您可以避開常規的保護機制,並執行通常無法訪問的調用私有構造函數和方法之類的操作。 Java不允許您在沒有setAccessible調用的情況下通過私有構造函數實例化一個類-本質上來說,這意味着“我知道我不應該這樣做,但是...”

如果您需要運行不受信任的代碼,則可以使用SecurityManager機制來禁止這種“破壞規則”。

因為Java無法知道您打算將類用作單例。 如果要使用此類,請使用枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM