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

机电建设工程施工网站图片南京企业网站

机电建设工程施工网站图片,南京企业网站,wordpress常用函数大全,建立网站需要注意事项单例模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在 Java 中,我们常常通过私有化构造方法和提供静态访问方法来实现单例。然而,尽管这些手段可以有效防止类的实例化,反射和序列化依然能…

单例模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在 Java 中,我们常常通过私有化构造方法和提供静态访问方法来实现单例。然而,尽管这些手段可以有效防止类的实例化,反射和序列化依然能够破坏单例模式的唯一性。本文将重点讲解序列化如何破坏单例模式,以及如何通过 readResolve 方法来防止这种破坏。


1. 序列化和反序列化

序列化 是指将对象的状态转换为字节流,以便存储或传输;反序列化 则是将字节流恢复为对象的过程。

当一个单例对象被序列化并随后反序列化时,反序列化过程会创建一个新的对象。由于反序列化是通过从字节流恢复对象的属性状态,而不是通过调用构造方法,这导致反序列化后的对象与原始的单例实例不同。因此,反序列化过程实际上破坏了单例模式的约束。

2. 序列化如何破坏单例模式

假设我们有一个单例类如下:

import java.io.*;public class Singleton implements Serializable {private static final Singleton INSTANCE = new Singleton();private Singleton() {// 防止通过反射破解if (INSTANCE != null) {throw new RuntimeException("单例模式禁止反射调用!");}}public static Singleton getInstance() {return INSTANCE;}
}

现在让我们通过序列化和反序列化来测试这个单例类:

public class Main {public static void main(String[] args) throws Exception {Singleton instance1 = Singleton.getInstance();// 序列化对象ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("singleton.ser"));out.writeObject(instance1);out.close();// 反序列化对象ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));Singleton instance2 = (Singleton) in.readObject();in.close();// 比较两个实例System.out.println(instance1 == instance2);  // 输出:false}
}

问题:反序列化出来的对象 instance2 与原单例对象 instance1 是不同的实例。这显然破坏了单例模式的唯一性。


3. 使用 readResolve 防止破坏

为了解决序列化对单例模式的破坏问题,Java 提供了 readResolve 方法。在反序列化时,如果类定义了 readResolve 方法,Java 会调用这个方法,并用该方法的返回值替换反序列化生成的新对象。这意味着我们可以通过 readResolve 返回已经存在的单例对象,从而防止反序列化创建新对象。

我们可以在 Singleton 类中添加 readResolve 方法:

private Object readResolve() {return INSTANCE;  // 返回当前已存在的单例实例
}
反序列化的执行流程:
  1. 反序列化时会创建一个新的对象。
  2. 在对象完全反序列化后,Java 会检查是否存在 readResolve 方法。如果有,则调用该方法。
  3. 该方法的返回值将替换反序列化生成的对象,从而确保仍然是同一个单例对象。

通过加入 readResolve 方法,程序的输出会变成:

System.out.println(instance1 == instance2);  // 输出:true
完整代码示例:
import java.io.*;public class Singleton implements Serializable {private static final Singleton INSTANCE = new Singleton();private Singleton() {if (INSTANCE != null) {throw new RuntimeException("单例模式禁止反射调用!");}}public static Singleton getInstance() {return INSTANCE;}// readResolve 方法防止反序列化破坏单例private Object readResolve() {return INSTANCE;  // 返回当前已存在的单例实例}
}

4. 为什么 readResolve 有效

readResolve 能防止序列化破坏单例的根本原因在于它的特殊调用机制。Java 在反序列化完成后自动调用类中的 readResolve,允许我们返回一个已有的实例,从而避免生成新的对象。在单例模式中,我们可以让 readResolve 方法返回类的单例对象 INSTANCE,这样即使经历序列化和反序列化,最终得到的对象仍然是同一个单例实例。

5. 其他注意事项

  • 防止反射破坏单例:尽管 readResolve 可以防止序列化破坏单例,但反射仍然能够通过调用私有构造方法来破坏单例。因此,建议在构造方法中添加逻辑,防止反射调用,如上文所示的 if (INSTANCE != null) 检查。

  • 序列化破坏的影响:当系统中有需要频繁序列化与反序列化的单例对象时,务必要考虑使用 readResolve 来确保单例模式的完整性,否则可能会导致多个实例并存,破坏系统设计。


6. 总结

在 Java 的单例模式中,序列化和反序列化可能会破坏单例的唯一性,而通过 readResolve 方法可以有效防止反序列化生成新对象,从而维护单例模式的约束。使用 readResolve 可以确保反序列化时返回的是现有的单例实例,而不是新的对象。对于需要持久化的单例类来说,这是一个非常重要的防御措施。

确保你的单例模式在序列化和反射攻击下都具备防御机制,才能真正做到一个类的实例唯一。

⚠️:搞来搞去都不太行,要么被反射破坏、要么被序列化破坏,都得自己写代码进行解决,那么有什么可以直接用的单例模式的实现方式呢?还真有,JVM已经给我们准备好了:枚举实现序列化


文章转载自:

http://5sHfZVH0.rqrxh.cn
http://MTlQyqPK.rqrxh.cn
http://VRDFoWcf.rqrxh.cn
http://IbcwWhYP.rqrxh.cn
http://IXDCAR6z.rqrxh.cn
http://l4gyVO6y.rqrxh.cn
http://N0PdRAk1.rqrxh.cn
http://mhJ56uL3.rqrxh.cn
http://bUwcl0Bk.rqrxh.cn
http://2BF8itxc.rqrxh.cn
http://TwyJkd9w.rqrxh.cn
http://3nUmJVlr.rqrxh.cn
http://bDZg1L4Y.rqrxh.cn
http://vSINDjG7.rqrxh.cn
http://zo0XDE2s.rqrxh.cn
http://Rjef0f21.rqrxh.cn
http://U5KeooJq.rqrxh.cn
http://hk9HOdqT.rqrxh.cn
http://OQg7aEXm.rqrxh.cn
http://XvN9okE0.rqrxh.cn
http://SZ3suGIc.rqrxh.cn
http://GuO84Iao.rqrxh.cn
http://1yHl0J5Q.rqrxh.cn
http://jrkeU8WJ.rqrxh.cn
http://8zjjIqK6.rqrxh.cn
http://Mt9oH4h2.rqrxh.cn
http://oRTDF303.rqrxh.cn
http://d91pkbYD.rqrxh.cn
http://FTfDzscS.rqrxh.cn
http://JxHn9NcM.rqrxh.cn
http://www.dtcms.com/wzjs/705617.html

相关文章:

  • 要建设企业网站国外很炫酷的网站
  • 如何做产品网站公司注册资金实缴政策最新
  • 无锡鑫融建设网站浙江住房和城乡建设厅报名网站
  • 江苏华东建设基础工程有限公司网站网站rp原型图怎么做
  • 修改网站照片需要怎么做昆明做网站公司有哪些
  • 网站建设广告平台推广建e室内设计网全景分类
  • 石家庄定制建站wordpress文章添加链接地址
  • 个人网站做电影资源链接犯法吗宁波网站建设的价格表
  • wordpress导航站手机优化怎么关闭
  • 青岛做网站的公司排名怎样用电脑做网站
  • 内江网站建设0832hdsj每平每家设计家官网
  • 银州铁岭做网站培训前端网站开发
  • php网站开发个人简历手机app界面设计模板图片
  • 国内互联网建站公司排名孝昌网站建设
  • 南阳专业网站制作费用怎么做网站和服务器吗
  • ui自学网站济南市住房和城乡建设部网站
  • 西安城乡住房建设厅网站什么网站能接单做网站
  • 有哪些好的做兼职网站深圳市住建局工程交易服务网
  • 娄底本地做寄生虫网站设计素材网排名
  • 网站logo在线设计网站维护协议书
  • 做旅游网站的yi乐清网站推广公司
  • 医院行业的网站是很难做吗高清网站建设的好处
  • 农业科技公司网站建设邢台视频优化方案
  • 北京高端网站定制公司哪家好一个网站多个数据库
  • 网站建设可以自己弄吗知乎一站式网站建设方案
  • 广州市招投标网站手机做印章网站
  • 南通做网站优化wordpress论坛采集
  • 建设手机网站多少钱洛阳网站推广公司
  • 四川学校网站建设公html代码大全(很全的
  • 肇东市建设局网站网页加速器免费