从序列化中恢复一个单例对象会破坏单例模式,解决方法是添加readResolve()

原理:

1.反序列化时,首先获取序列化的类 : desc(
可理解为单例类的class类,但它和JVM加载到内存中的单例class类有不同)因为如果我们的单例类在构造方法中通过实例不为空则抛出异常防止了反射破坏单例,那单例类是不允许再实例化的。而desc类却依然可以实例化。(当我们反序列化一个对象时,永远不会调用其类的构造函数,反序列化后的实例变量与序列化之前的实例变量相同,类变量与当前的类变量相同,如果反序列化时类未被加载则类变量为默认值。)

2.判断对象是否能实例化。可以则进行实例化,至此单例类进行了第一次实例化,对象名为obj
3. 第一次实例化完成后,通过反射寻找该单例类中的readResolve()方法,没有则直接返回obj对象。(这就是直接反序列化破坏单例模式的原因)
4. 有定义readResolve()方法,desc通过invokeReadResolve(Object
obj)方法调用readResolve()方法获取单例对象instance,将他赋值给rep,如果单例对象之前已经被实例化过,那么rep就会指向之前实例化的单例对象。如果我们之前没有实例化单例对象,则rep会指向null。
5. rep与obj进行比较,由于obj是反射获取的对象,当然与rep不等,于是将rep的值instance赋值给obj,将obj返回,返回对象instance也就保证了单例。

简而言之就是,当我们通过反序列化readObject()方法获取对象时会去寻找readResolve()方法,如果该方法不存在则直接返回新对象,如果该方法存在则按该方法的内容返回对象,以确保如果我们之前实例化了单例对象,就返回该对象。如果我们之前没有实例化单例对象,则会返回null。

readResolve()原理相关推荐

  1. java 序列化 原理解析

    序列化相关文章: * Java 序列化 之 Serializable * Java 序列化之 Externalizable * Java 序列化 之 单例模式. 阅读本文章之前,务必要阅读上面的三篇文 ...

  2. 单例设计模式-反射攻击解决方案及原理分析

    package com.learn.design.pattern.creational.singleton;import java.io.Serializable;public class Hungr ...

  3. 单例设计模式-序列化破坏单例模式原理解析及解决方案

    越来越成熟了,那是不是坚不可摧的呢,现在我们就要用序列号和反序列化来破坏单例模式,后面也会重点讲一下原理,好好听,让我们来一起破坏单例模式吧,首先还是来到Test类里边 package com.lea ...

  4. Java中序列化实现原理研究

    1.什么是序列化和反序列化 序列化 是指将Java对象保存为二进制字节码的过程. 反序列化 将二进制字节码重新转成Java对象的过程. 2.为什么序列化 我们知道,一般Java对象的生命周期比Java ...

  5. UUID的使用及其原理

    今天敲项目要用UUID,想起之前老师告诉UUID的使用,但没说具体的生成逻辑,于是我进行了百度 首先,UUID的使用: //生成随机的UUID String uuid = UUID.randomUUI ...

  6. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  7. git原理及常见使用方法

    Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...

  8. 微机原理—定时计数控制接口

    别看题目很高深,其实就是很简单的定时器和计数器而已. 通常用手机定个闹钟,就是定时器的使用. 工厂里通过传送带上安装传感器,传感器传输给计算机的信号用来计数. 这是一些很简单的应用,通过很小的一个芯片 ...

  9. 三层交换机原理:01路由器如何隔离广播域?

    前言: 当网络规模较大的时候,需要设备来隔离广播域,防止网络中因产生广播风暴而导致网络效率降低,而二层交换机不能隔离广播域,所以需要三层路由器设备来隔离广播域! 但三层路由器为什么能够隔离广播域,是如 ...

  10. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

最新文章

  1. java如何确保单线程_java – 任何单线程程序如何成为有效的多线程程序?
  2. Springboot08-项目单元测试(接口测试)
  3. 转:ASP自动解压RAR文件
  4. Python__封装
  5. C# 报警 控制蜂鸣器发声
  6. PHP从零开始--数据库
  7. 你真的了解load方法么?(转载)
  8. Tips--Ubuntu16.04系统安装时无法连接WiFi
  9. leetcode547. 省份数量
  10. 特征工程之特征预处理
  11. SpringBoot实现的简单停车位管理系统
  12. java入门代码大全,2022最新
  13. devc语言图形编程教程_devc编程软件程序怎么调试 devc调试步骤图文方法教程
  14. 2020.11.18 比赛总结题解合集
  15. Eclipse下搭建安卓开发环境(初步)
  16. 数据仓库如何保证数据一致性
  17. CAN Bus-Off详解
  18. 题库——“计算机基础”
  19. 纳税人信息0服务器信息1,​财务报表提示没有申报清册信息是什么原因
  20. 百度网盘不限速,一次性安排5款下载神器!

热门文章

  1. 理解Servlet及其对象
  2. android中的四种基本动画
  3. WTL学习笔记(5)系统皮肤管理
  4. 微信小程序 选择微信自带的地址 用户授权选择了拒绝
  5. 前端框架Vue(3)——vue-cli 目录结构
  6. 【HDOJ】1667 The Rotation Game
  7. golang fmt.printf()
  8. 用viewpager实现图片轮播
  9. Emacs下使用Stardict
  10. 4.从Paxos到Zookeeper分布式一致性原理与实践--- Zookeeper 与 Paxos