反射与序列化破解单例模式及解决方法
class Singleton {
//饿汉式,立即加载,类加载线程安全
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
Singleton s1=Singleton.getInstance();
Singleton s2=Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
输出:
sf3.Singleton@1db9742
sf3.Singleton@1db9742
使用反射破解单例:
Class<Singleton> clazz=(Class<Singleton>)
Class.forName("sf3.Singleton");
Constructor<Singleton> c=clazz.getDeclaredConstructor(null);
c.setAccessible(true);
Singleton ss1=c.newInstance();
System.out.println(ss1);
输出:
sf3.Singleton@106d69c
解决反射破坏单例:
private Singleton(){
if(instance!=null){
throw new RuntimeException();
}
}
序列化破解:
class Singleton implements Serializable{
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
FileOutputStream fos=new FileOutputStream("d:/a.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.close();
fos.close();
ObjectInputStream ois=
new ObjectInputStream(new FileInputStream("d:/a.txt"));
Singleton s3=(Singleton) ois.readObject();
System.out.println(s3);
输出:
sf3.Singleton@873330
解决序列化破解反射:
class Singleton implements Serializable{
private Singleton(){}
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
private Object readResolve(){
return instance;
}
}
上一篇:
IDEA上Java项目控制台中文乱码
