使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)
原因分析
1.反序列化方法
① jdk8中的Enum源码中对反序列化方法进行重写,抛出异常。
-
java.lang.Enum#readObject方法截图如下

②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化,从而确保了枚举的单例特性。
具体来说,在 Java 的序列化过程中,当对象被反序列化时,ObjectInputStream 类会调用 readObject 方法来读取对象。对于枚举类型,readObject 方法会调用 readEnum,后者会根据枚举的类型和名称来查找已经存在的枚举常量:Enum.valueOf()。
java.io.ObjectInputStream#readObject方法截图如下

java.io.ObjectInputStream#readEnum方法截图如下,包含Enum.valueOf()

这一过程确保了以下几点:
-
确保单例性:
readEnum方法通过调用Enum.valueOf()来查找与名称匹配的枚举常量,这意味着无论你如何尝试反序列化,得到的都是已经存在的枚举实例,保证了枚举的单例特性。 -
防止实例创建:由于枚举的构造函数是私有的,而且在反序列化过程中不会直接调用构造函数,因此无法创建新的枚举实例。
2.反射newInstance()方法
在 Java 中,使用反射的 java.lang.reflect.Constructor#newInstance 方法来创建枚举类的实例时,会进行特殊的检查。
如果尝试通过反射调用 newInstance 方法来创建一个枚举类型的实例,Java 会抛出 IllegalArgumentException,并指出 "Cannot reflectively create enum objects"。这一设计是为了保护枚举类型,确保它们的实例唯一性。
如下代码:

枚举在 Java 中被设计为单例,每一个枚举常量在一个应用程序的生命周期中只能存在一个实例。由于枚举常量在定义时就已经实例化,Java 不允许通过反射来创造额外的枚举实例。这一机制通过阻止反射创建枚举对象,进一步增强了枚举的安全性和一致性。
因此,结合 ObjectInputStream 在反序列化时对枚举类型的特殊处理和反射机制的限制,共同保证了枚举类型不会被意外或者恶意地创建多个实例。
Enum的反编译
Enum 类型的静态初始化(static)
枚举类在类加载时,会静态初始化并创建实例,这一过程是由 JVM 保证的。因此,枚举类型的实例是在类加载时就已经创建好了,而反序列化时只是获取这个已存在的实例。这种机制避免了创建多个枚举实例的风险。
枚举的反编译,属性都有static修饰。

单例模式示例
假设有一个简单的枚举单例类:
import java.io.Serializable;public enum Singleton implements Serializable {INSTANCE;public void someMethod() {System.out.println("This is a method in the Singleton instance.");}
}
反射攻击与反序列化攻击
通常,在实现单例模式时,使用反射可以绕过单例的构造方法,从而创建多个实例。而反序列化攻击则是通过反序列化创建新实例,绕过单例的构造过程。
有人说枚举单例不会被破坏是因为:
普通类的反序列化使用了unsafe,枚举没有使用。
在 Java 中,反序列化的过程是为了将序列化的字节流转换回对象。为了提高性能,Java 的反序列化机制使用了 Unsafe 类来直接操作内存。普通类的反序列化可能会涉及到创建新的对象实例,这时使用 Unsafe 可以避免调用构造函数,从而提高效率。
然而,对于枚举类来说,Java 语言设计上已经保证了枚举实例是唯一的(即单例)的。在反序列化过程中,枚举的实例是通过 Enum.valueOf() 方法进行查找的,这个方法会在枚举值唯一的情况下返回已存在的实例,而不是创建新的实例。
如有说错的地方请大家及时指出以免误导他人
参考
你知道吗?枚举单例模式是世界上最好的单例模式!-CSDN博客
相关文章:
使用枚举实现单例模式,不会反序列化破坏攻击,不会被反射破坏攻击。(附带枚举单例的简单实现)
原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写,抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化,从而确保了枚举的单例特性。 …...
scala隐式转换
概念: 在Scala编程语言中,隐式转换是一种强大的功能,它允许程序在需要时自动转换数据类型或增强对象功能。这种转换通常是通过定义一个标记为implicit的函数来实现的,这个函数能够将一种类型转换为另一种类型。隐式转换的使用可以…...
Spring Boot 应用 “Connection is closed” 及 MySQL 空闲超时断开连接解决方案
在使用 Spring Boot MySQL HikariCP 的组合时,可能会在生产或测试环境中遭遇类似如下异常信息: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT ...]; SQL state [nu…...
SLF4J框架原理及其实现方案
slf4j 是一个日志规范框架;基本上所有的 JAVA 日志都要实现这个规范;比如:Logback、log4j、log4j2;本文档记载如何实现 slf4j 规范;实现自己的日志框架; slf4j 分为两个部分,其中包含 …...
代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)
day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercarl.com/kamacoder/图论理论基础.html#图的基本概念 day01 所有可达路径 邻接矩阵 import java.util.Scanner;import java.util.List;import java.util.ArrayL…...
【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统
在企业管理中,企业资源规划(ERP)系统是不可或缺的工具。它能够帮助企业高效管理各种资源,包括人力资源、财务资源和库存等。Java作为一种成熟的编程语言,因其跨平台特性、强大的生态系统以及良好的社区支持,…...
springboot配置过滤器解决html资源路径和接口路径冲突问题
比如: html文件使用 / 接口路径使用 /api 首先配置文件里肯定配置范围最大的根路径 server:port: 80servlet:context-path: / 过滤器代码 Slf4j public class RequestSeparationFilter implements Filter {Overridepublic void init(FilterConfig filterConfi…...
在IDE中使用Git
我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…...
【AIGC进阶-ChatGPT提示词副业解析】反向心理学在沟通中的运用:激将法的艺术
引言 在日常沟通和管理中,直接的表达方式并不总能达到预期效果。反向心理学,特别是其中的激将法,作为一种独特的沟通技巧,往往能在看似消极的表达中激发出积极的反应。本文将深入探讨反向心理学中激将法的运用技巧、实施策略及其…...
JeecgBoot passwordChange 任意用户密码重置漏洞复现
0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...
【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人
【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆),可以在浏览器和node.js、deno、e…...
Blazor(.razor)+VUE+elementUI适合一起用吗
在实际项目中,将 Blazor(.razor) 与 Vue.js 和 ElementUI 一起使用是可以实现的,但是否适合取决于你的项目需求、开发团队的技术栈和具体场景。以下是对这种组合的详细分析: 一、适合一起使用的场景 1.1 逐步引入 Bla…...
SpringBoot左脚进门之Maven管理家
一、概念 Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化, 使开发团队用极少的时间就能够自动完成工程的基础构建配置。 Maven 简化了工程的构建过程,并对其标准化,提高了重用性。 Maven 本地仓库 (Local Reposi…...
188-下翻便携式6U CPCI工控机箱
一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…...
Ubuntu 挂载目录
1. 临时挂载(重启后失效) 创建挂载点: $ sudo mkdir -p /work临时挂载磁盘到 work 目录: $ sudo mount /dev/nvme0n1p1 /work验证挂载是否成功: $ df -h /work此方法挂载在系统重启后会失效,需手动重新挂载…...
基于IEEE 802.1Qci的时间敏感网络(TSN)主干架构安全分析及异常检测系统设计
中文标题:基于IEEE 802.1Qci的时间敏感网络(TSN)主干架构安全分析及异常检测系统设计 英文标题:Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…...
2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP
本篇文章,小编将与大家一同探讨2024年食堂采购系统的技术趋势,并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年,AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...
zotero安装教程(包括茉莉花插件)
zotero安装教程(包括茉莉花插件) zotero下载(windows)1-安装 Zotero2-安装 Zotero Connector3-安装浏览器插件--jasminum茉莉花功能:插件下载地址:[https://github.com/search?qjasminum&typerepositories](https://github.c…...
webpack4 - 配置文件分离(详细教程)
webpack根据开发和生成环境一般可以将配置文件拆分,拆分dev和prod两种环境 |- package.json|- /build|- webpack.base.js|- webpack.dev.js|- webpack.prod.js在scripts里修改相应的命令 "dev": "webpack-dev-server --config build/webpack.dev.j…...
MongoDB 分片
MongoDB 分片 MongoDB 分片是一种数据库架构,用于将大量数据分布存储在多个服务器上。这种设计允许数据库扩展,以处理大量数据和高吞吐量操作。分片通过将数据集分割成小块,称为分片,并将这些分片分布到多个服务器上来工作。每个…...
阿里开源绘画模型Qwen-Image-2512:ComfyUI镜像内置工作流,支持2512高清分辨率
阿里开源绘画模型Qwen-Image-2512:ComfyUI镜像内置工作流,支持2512高清分辨率 1. 引言:高清图像生成的新选择 在AI绘画领域,分辨率一直是衡量生成质量的重要指标。阿里通义千问团队最新开源的Qwen-Image-2512模型,将…...
AB测试、质量监控都离不开它:深入浅出聊聊样本均值的t分布与F检验
AB测试与质量监控的统计基石:t分布与F检验实战指南 当产品经理纠结于哪个按钮颜色能带来更高转化率,当质量工程师需要判断生产线波动是否超出正常范围,背后都隐藏着两个关键统计工具:t分布与F检验。这些理论概念之所以能走出教科书…...
ModTheSpire终极指南:杀戮尖塔模组加载器完整使用教程
ModTheSpire终极指南:杀戮尖塔模组加载器完整使用教程 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire是一款专为《杀戮尖塔》设计的强大模组加载器,…...
FaceRecon-3D与TensorFlow:深度学习模型优化
FaceRecon-3D与TensorFlow:深度学习模型优化 1. 引言 你是否曾经遇到过这样的场景:训练了一个效果不错的FaceRecon-3D模型,但在实际部署时却发现推理速度太慢,内存占用太高?或者想要在移动设备上运行3D人脸重建&…...
告别理论眩晕!用‘水波共振’和‘弹簧阻尼’比喻秒懂准PR控制传递函数
告别理论眩晕!用‘水波共振’和‘弹簧阻尼’比喻秒懂准PR控制传递函数 想象一下,你正在湖边用不同频率的音叉轻触水面——只有当音叉频率与湖水固有频率完全匹配时,才会激起巨大的涟漪。这种"挑剔"的共振现象,正是理解准…...
嵌入式系统的组成和模式深入分析
嵌入式系统的组成和模式深入分析 嵌入式系统是一个软硬件紧密结合的专用计算机系统。下面从组成结构和工作模式两个维度进行深入分析。 第一部分:嵌入式系统的组成结构 一、总体架构图 text ┌─────────────────────────────────────…...
UsbDk:突破Windows USB访问壁垒的开源驱动开发套件
UsbDk:突破Windows USB访问壁垒的开源驱动开发套件 【免费下载链接】UsbDk Usb Drivers Development Kit for Windows 项目地址: https://gitcode.com/gh_mirrors/us/UsbDk 技术背景解析 解构Windows USB访问限制 在Windows操作系统架构中,USB设…...
3步解锁Windows PDF处理新高度:Poppler预编译包深度解析
3步解锁Windows PDF处理新高度:Poppler预编译包深度解析 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 你是否还在为Windows平台上复杂…...
Asian Beauty Z-Image Turbo商业应用:快速生成品牌宣传东方形象照
Asian Beauty Z-Image Turbo商业应用:快速生成品牌宣传东方形象照 大家好,今天我们来聊一个对品牌方、市场人员和内容创作者特别有吸引力的工具——Asian Beauty Z-Image Turbo。如果你正在为品牌宣传、社交媒体内容或营销活动寻找高质量的东方形象照&a…...
WarcraftHelper:经典游戏现代重生的兼容性解决方案
WarcraftHelper:经典游戏现代重生的兼容性解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 让魔兽争霸III完美适配Windows 10/11系…...
