为什么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中允许这样做?
答案 0 :(得分:5)
使用这样的反射可以让你回避正常的保护机制,并执行调用私有构造函数和通常无法访问的方法之类的东西。 Java不允许您在没有setAccessible
调用的情况下通过私有构造函数实例化一个类 - 实际上这意味着“我知道我不应该这样做但是......”
如果您需要运行不受信任的代码,那么您可以使用SecurityManager
机制禁止这种“违反规则”。
答案 1 :(得分:2)
因为Java无法知道您希望将该类用作单例。如果你想要这样一个类,请使用枚举。