gpt4 book ai didi

java - 两个不同的类加载器打破单例

转载 作者:搜寻专家 更新时间:2023-11-01 02:12:36 28 4
gpt4 key购买 nike

<分区>

我正在设计下面的单例类,我知道我的单例在哪里可以被破坏

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 ();
}
}

下面的 url 已经暗示了单例可以被破坏的地方 cracking singleton with other ways但我的查询是,正如此 url 中所建议的那样,单例可以被类加载器破坏,同一个类也可以被两个不同的类加载器加载,因此,您可以通过简单地调用它的 getInstance() 方法来创建单例类的两个实例在由两个不同的类加载器加载的类中。这种方法无需诉诸于违反私有(private)构造函数即可起作用。

ClassLoader cl1 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
ClassLoader cl2 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
Class<?> singClass1 = cl1.loadClass("hacking.Singleton");
Class<?> singClass2 = cl2.loadClass("hacking.Singleton");
//...
Method getInstance1 = singClass1.getDeclaredMethod("getInstance", ...);
Method getInstance2 = singClass2.getDeclaredMethod("getInstance", ...);
//...
Object singleton1 = getInstance1.invoke(null);
Object singleton2 = getInstance2.invoke(null);

请告知应采取什么措施来避免这种情况。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com