Java 为什么我可以创建多个带有反射的单例实例?
为什么java不阻止您实例化任何单例类对象 我试图创建Void类的对象Java 为什么我可以创建多个带有反射的单例实例?,java,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.prin
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不允许在没有setAccessible调用的情况下通过私有构造函数实例化类-本质上这意味着我知道我不应该这样做,但是
如果您需要运行不受信任的代码,那么您可以使用SecurityManager机制来禁止这种违反规则的行为。因为Java无法知道您打算将该类用作单例。如果您想要这样一个类,请使用枚举。因为Java无法知道您打算将该类用作单例。如果您想要这样一个类,请使用枚举。使用单例模式不会将您从通过反射创建的实例中解救出来。您可以使用反射访问私有字段和构造函数。因此,Java并不允许这样做。它是违反规则的反射API。顺便说一句,Void不是一个单例,它的目的是没有实例,因为它只是作为Void.TYPE的容器,与int的其他基元类型类对象Integer.TYPE一致。使用单例模式不会将您从通过反射创建的实例中解救出来。您可以使用反射访问私有字段和构造函数。因此,Java并不允许这样做。是反射API打破了这一规则。顺便说一句,Void不是单例,它的目的是没有实例,因为它只是作为Void.TYPE的容器,与int的其他基本类型类对象Integer.TYPE一致,等等。。