为什么我可以使用反射创建多个单例实例?

时间:2012-10-30 08:10:33

标签: java

为什么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中允许这样做?

2 个答案:

答案 0 :(得分:5)

使用这样的反射可以让你回避正常的保护机制,并执行调用私有构造函数和通常无法访问的方法之类的东西。 Java不允许您在没有setAccessible调用的情况下通过私有构造函数实例化一个类 - 实际上这意味着“我知道我不应该这样做但是......”

如果您需要运行不受信任的代码,那么您可以使用SecurityManager机制禁止这种“违反规则”。

答案 1 :(得分:2)

因为Java无法知道您希望将该类用作单例。如果你想要这样一个类,请使用枚举。