当前位置: 首页 > news >正文

保定百度网站建设深圳网站营销seo电话

保定百度网站建设,深圳网站营销seo电话,广元市网站建设,discuz手机模板原因分析 1.反序列化方法 ① jdk8中的Enum源码中对反序列化方法进行重写,抛出异常。 java.lang.Enum#readObject方法截图如下 ②java.io.ObjectInputStream#readObject 方法中的 readEnum 方法处理了枚举类型的反序列化,从而确保了枚举的单例特性。 …

原因分析

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()

这一过程确保了以下几点:

  1. 确保单例性readEnum 方法通过调用 Enum.valueOf() 来查找与名称匹配的枚举常量,这意味着无论你如何尝试反序列化,得到的都是已经存在的枚举实例,保证了枚举的单例特性。

  2. 防止实例创建:由于枚举的构造函数是私有的,而且在反序列化过程中不会直接调用构造函数,因此无法创建新的枚举实例。

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博客

http://www.khdw.cn/news/14653.html

相关文章:

  • 信主网站搜索引擎大全网址
  • 韩国最牛的设计网站大全合肥seo排名扣费
  • 湖北建设工程造价协会网站达内教育
  • 阿里云网站建设教程电商关键词一般用哪些工具
  • 做的网站老被攻击广州最新疫情情况
  • 要怎样做网站发到百度上面引流推广接单
  • 南宁网站建设费用杨谦教授编的营销课程
  • 企业建站公司哪里有淘宝推广工具
  • 东营网站设计多少钱互联网营销顾问
  • 网站维护费用明细刷关键词排名seo
  • 网站收录提交入口班级优化大师电脑版
  • 呼市网站开发长沙企业关键词优化哪家好
  • 页面素材网站建设及推广优化
  • ftp 企业网站凡科建站官网
  • 海曙区住房和建设局网站官网设计公司
  • 常州网站建设key de网站功能优化的方法
  • 深圳做网站最好的公司网络营销的方式和方法
  • 建设网站财务分析广州网站设计
  • 360建筑网忘记登入密码了怎么办北京seo外包公司要靠谱的
  • 信用网站标准化建设营销型网站建设报价
  • 网页设计与制作教程欧静美福州seo快速排名软件
  • 淘宝联盟网站建设源码网络推广业务
  • 新乡网站开发的公司电话百度24小时人工客服电话
  • 某购物网站建设方案互联网营销推广渠道
  • 西安有关做网站的公司有哪些百度推广官方电话
  • 企业网站一定要备案吗清远市发布
  • 企业品牌网站营销网站建设 全网营销
  • seo优化查询天津seo网站管理
  • 塑料袋销售做哪个网站推广好网站优化人员通常会将目标关键词放在网站首页中的
  • 常平营销网站建设太原网络营销公司