我只是关注this answer并且坚持了下来。 我正在做的是保护我的Singleton类使用不同的类加载器加载两次。我没有使用任何自定义类加载器。 有没有办法停止使用URLClassLoader加载两次?
我的单身课
package hacking;
public class Singleton {
private static Singleton ref;
private Singleton() {
}
public static synchronized Singleton getSingletonObject() {
if (ref == null)
ref = new Singleton();
return ref;
}
public Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
}
我从 Singleton.java 中创建了一个 jar 文件,然后加载了两次相同的jar。
package com.foo;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class SingletonTest {
public static void main(String[] args) throws Exception {
URL url = new URL("file:\\D:\\foo\\singleton.jar");
ClassLoader cl1 = new URLClassLoader(new URL[] { url }, null);
ClassLoader cl2 = new URLClassLoader(new URL[] { url }, null);
Class<?> singClass1 = cl1.loadClass("hacking.Singleton");
Class<?> singClass2 = cl2.loadClass("hacking.Singleton");
Method getInstance1 = singClass1.getDeclaredMethod("getSingletonObject", null);
Method getInstance2 = singClass2.getDeclaredMethod("getSingletonObject", null);
Object singleton1 = getInstance1.invoke(null);
Object singleton2 = getInstance2.invoke(null);
System.out.println(singleton1.hashCode());
System.out.println(singleton2.hashCode());
/* this is problem i am trying to solve, cause i get two different object
for my singleton class. */
}
}
如何保护我的单件类在这里加载两次?我需要一个共同的父级来加载该类,但我在这种情况下如何实现?
请帮我解释一下代码,我的英语不好。
感谢你的善良和建设性。