ava_228_GOF23设计模式_单例模式_反射和反序列化漏铜和解决方案_多线程环境测试_CountDownLatch同步类的使用_练习2

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值