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

Pre*_*bia 1 java

为什么java不会阻止你实例化任何单例类对象?

我试图创建Void类的对象

java.lang.Void
Run Code Online (Sandbox Code Playgroud)

我写了这段代码来创建两个实例

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();
} 
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释 - 为什么这在java中是允许的?

Ian*_*rts 5

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

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