反射与序列化破解单例模式及解决方法
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项目控制台中文乱码