单例模式的破解 (反射及序列化方式)

来源:互联网 发布:起名网络中国 编辑:程序博客网 时间:2024/04/30 18:21

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;}
反序列化时直接通过该方法返回对象,不再创建单独的对象






0 0
原创粉丝点击