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,它是延迟加载的,它的构造是线程安全的。您不需要使用锁来获取实例,从而使其更快、更高效。它有一个私有构造函数,不能使用反射创建。它可以有实例方法,也可以实现接口。嗯,这比其他选择要简单和清楚得多。你还想知道什么?