Java 开裂单态

Java 开裂单态,java,classpath,Java,Classpath,我正在学习单例模式,下面是我的单例课程 package CrackingSingleton; public class SingletonObject { private static SingletonObject ref; private SingletonObject () //private constructor { } public static synchronized SingletonObject getSing

我正在学习单例模式,下面是我的单例课程

    package CrackingSingleton;

public class SingletonObject {
    private static SingletonObject ref; 
    private SingletonObject () //private constructor
    {   
    }

    public  static synchronized   SingletonObject getSingletonObject()
    {if (ref == null)
    ref = new SingletonObject();
    return ref;
        }

    public Object clone() throws CloneNotSupportedException
    {throw new CloneNotSupportedException ();
    }
    }
我正在尝试破解它,下面是我的一段代码

 package CrackingSingleton;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class CrackingSingleton {    
     public static void main(String[] args) throws ClassNotFoundException,
       IllegalArgumentException, SecurityException,
       InstantiationException, IllegalAccessException,
       InvocationTargetException {      
        //First statement retrieves the Constructor object for private constructor of SimpleSingleton class.
        Constructor pvtConstructor = Class.forName("CrackingSingleton.SingletonObject.java").getDeclaredConstructors()[0];
        //Since the constructor retrieved is a private one, we need to set its accessibility to true.
        pvtConstructor.setAccessible(true);
        //Last statement invokes the private constructor and create a new instance of SimpleSingleton class.
         SingletonObject  notSingleton1 = ( SingletonObject) pvtConstructor.newInstance(null);
         SingletonObject  notSingleton2 = ( SingletonObject) pvtConstructor.newInstance(null);
    }
}
但是在执行上面的类CrackingSingleton时,它会抛出错误

Exception in thread "main" java.lang.ClassNotFoundException: CrackingSingleton.SingletonObject.java
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at CrackingSingleton.CrackingSingleton.main(CrackingSingleton.java:14)
您正在将.java添加到类名中。Java类名不包括.Java。所以你的代码应该是

Constructor pvtConstructor = Class.forName("crackingsingleton.SingletonObject").getDeclaredConstructors()[0];
请注意,我将您的包名更改为不大写。

您正在将.java添加到您的类名中。Java类名不包括.Java。所以你的代码应该是

Constructor pvtConstructor = Class.forName("crackingsingleton.SingletonObject").getDeclaredConstructors()[0];

请注意,我将您的包名更改为不大写。

发生这种情况是因为您请求了错误的类。顺便说一句,stacktrace中也明确说明了这一点

// This should work
// There is no need to add .java or .class declaration. 
Class.forName("CrackingSingleton.SingletonObject")

以上所说的,那么您可能需要考虑使用. 发生这种情况是因为你申请了错误的课程。顺便说一句,stacktrace中也明确说明了这一点

// This should work
// There is no need to add .java or .class declaration. 
Class.forName("CrackingSingleton.SingletonObject")

以上所说的,那么您可能需要考虑使用. 我建议试试这个。enum更简单、更健壮

package crackingSingleton;

public enum SingletonObject {
    INSTANCE;
}
印刷品

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
    at java.lang.reflect.Constructor.newInstance(Constructor.java:520)
    at crackingSingleton.CrackingSingleton.main(CrackingSingleton.java:12)

我建议试试这个。enum更简单、更健壮

package crackingSingleton;

public enum SingletonObject {
    INSTANCE;
}
印刷品

Exception in thread "main" java.lang.IllegalArgumentException: Cannot reflectively create enum objects
    at java.lang.reflect.Constructor.newInstance(Constructor.java:520)
    at crackingSingleton.CrackingSingleton.main(CrackingSingleton.java:12)

仅供参考,包名称通常不大写。CrackingSingleton.SingletonObject.java是源文件的名称,Class.forName.fyi对此不感兴趣,包名称通常不大写。CrackingSingleton.SingletonObject.java是源文件的名称,Class.forName对其不感兴趣。能否请您在枚举中详细说明..?enum Singleton是一个类,有一个且只有一个名为instance的实例,它是延迟加载的,其构造是线程安全的。您不需要使用锁来获取实例,从而使其更快、更高效。它有一个私有构造函数,不能使用反射创建。它可以有实例方法,也可以实现接口。嗯,这比其他选择要简单和清楚得多。你还想知道什么?你能详细地解释一下枚举吗?枚举单例是一个类,它有一个且只有一个实例名为instance,它是延迟加载的,它的构造是线程安全的。您不需要使用锁来获取实例,从而使其更快、更高效。它有一个私有构造函数,不能使用反射创建。它可以有实例方法,也可以实现接口。嗯,这比其他选择要简单和清楚得多。你还想知道什么?