1.通过反射破解单例
Class clazz = Class.forName("com.lwk.singleton.SingletonDemo2");
Constructor<SingletonDemo2> c = clazz.getDeclaredConstructor(null);
c.setAccessible(true);
SingletonDemo2 s3 = c.newInstance();
阻止反射破解单例
改造构造方法
private SingletonDemo2() {
if(instance != null){
throw new RuntimeException();
}
}
2.通过反序列化破解单例
前提是单例实现序列化
public class SingletonDemo2 implements Serializable
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/a.text"));
oos.writeObject(s1);;
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.text"));
SingletonDemo2 s3 = (SingletonDemo2) ois.readObject();
阻止反序列化破解单例
在单例类里面添加如下方法
public Object readResolve(){
return instance;
}
反序列化时直接通过该方法返回对象,不再创建单独的对象