解决办法:1,不实现Cloneable接口 2,对clone方法进行修改
public class HungarySingleton implements Cloneable {
private static final HungarySingleton hungarySingleton;
static {
hungarySingleton = new HungarySingleton();
}
private HungarySingleton() {
if (hungarySingleton != null) {
throw new RuntimeException("单例构造器防止反射调用");
}
}
public static HungarySingleton getInstance() {
return hungarySingleton;
}
@Override
protected Object clone() throws CloneNotSupportedException {
//return super.clone();//单例实现了克隆接口 可以利用反射破坏单例
return hungarySingleton;//解决办法 即使通过反射调用clone方法 获取到的依然是原来的实例对象
}
}
测试
HungarySingleton instance = HungarySingleton.getInstance();
Method cloneMethod = HungarySingleton.class.getDeclaredMethod("clone");
cloneMethod.setAccessible(true);
HungarySingleton newInstance = (HungarySingleton) cloneMethod.invoke(instance);
System.out.println(instance);
System.out.println(newInstance);