Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我可以创建多个带有反射的单例实例?_Java - Fatal编程技术网

Java 为什么我可以创建多个带有反射的单例实例?

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不阻止您实例化任何单例类对象

我试图创建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中允许这样做吗?

使用这样的反射可以让你避开正常的保护机制,做一些你通常无法访问的事情,比如调用私有构造函数和方法。Java不允许在没有setAccessible调用的情况下通过私有构造函数实例化类-本质上这意味着我知道我不应该这样做,但是


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

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


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

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

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

使用单例模式不会将您从通过反射创建的实例中解救出来。您可以使用反射访问私有字段和构造函数。因此,Java并不允许这样做。它是违反规则的反射API。顺便说一句,Void不是一个单例,它的目的是没有实例,因为它只是作为Void.TYPE的容器,与int的其他基元类型类对象Integer.TYPE一致。使用单例模式不会将您从通过反射创建的实例中解救出来。您可以使用反射访问私有字段和构造函数。因此,Java并不允许这样做。是反射API打破了这一规则。顺便说一句,Void不是单例,它的目的是没有实例,因为它只是作为Void.TYPE的容器,与int的其他基本类型类对象Integer.TYPE一致,等等。。