1

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

4

2 回答 2

5

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

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

于 2012-10-30T08:17:06.153 回答
2

因为 Java 无法知道您打算将该类用作单例。如果您想要这样的课程,请使用枚举。

于 2012-10-30T08:55:22.120 回答