package java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
-
测试 反射和反序列化破解单例模式
*/
public class Client03 {public static void main(String[] args) throws Exception {
//因为是私有的不能直接new
SingletonDemo07 s1 = SingletonDemo07.getInstance();
SingletonDemo07 s2 = SingletonDemo07.getInstance();System.out.println("====懒汉模式==="); System.out.println(s1); System.out.println(s2); //通过反序列化的方式构造多个对象;先要把SingletonDemo07 实现接口 FileOutputStream fos = new FileOutputStream("d:/a.txt"); //通过对象输出流 ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(s1); //关闭;应该用Try/catch正规些 oos.close(); fos.close(); //反序列化 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt")); //读取 SingletonDemo07 s3 = (SingletonDemo07) ois.readObject();//强制转型 System.out.println("==通过反序列化破解=="); System.out.println(s3);
}
}
//---------------------------------------
package java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习;
import java.io.Serializable;
/**
-
测试以懒汉式单例模式为例
-
如何防止 反序列化破解漏洞
*/
public class SingletonDemo07 implements Serializable{//SingletonDemo单例演示;implements工具;Serializable序列化
//2.不初始化;延时加载,用的时候在创建对象
private static SingletonDemo07 instance ;//防止反射破解单例
//1.构造器私有
private SingletonDemo07(){//如何防止程序运行跳过安全检查
if(instance!=null){//第一次调用为空;
throw new RuntimeException();//手动抛出异常;RuntimeException运行时异常
}
}
//3.synchronized同步;方法同步,调用效率低;
public static synchronized SingletonDemo07 getInstance(){//getInstance获取实例
if(instance==null){
instance = new SingletonDemo07();
}
return instance;
}
//防止反序列化的漏洞
//反序列化时,直接调用readResolve()这个方法;返回这个instance对象,而不需要单独创建反序列化的新对象返回
private Object readResolve(){return instance;
}
}
//结果--------------------破解-----------------------------
==懒汉模式=
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@4f1d0d
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@4f1d0d
通过反序列化破解
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@19106c7
//------------------------反破解------------------------
==懒汉模式=
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@1fc4bec
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@1fc4bec
防破解
java_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习.SingletonDemo07@1fc4bec