防止Java序列化/反射破坏单例模式的解决方案
发布日期:2021-06-30 12:24:39
浏览次数:3
分类:技术文章
本文共 482 字,大约阅读时间需要 1 分钟。
1 案例
-
熟悉的 DCL 单例实现
-
测试类
可见对Singleton
的序列化、反序列化得到的对象是一个新的对象,说明破坏了Singleton
的单例性。
2 序列化破坏单例的源码分析
看关键代码readOrdinaryObject
-
该处创建的
obj
就是本方法要返回的对象 -
isInstantiable:若一个
serializable/externalizable
的类可在运行时被实例化,则该方法返回true -
desc.newInstance:该方法通过反射调用无参构造器生成一个对象
所以在序列化的底层是会通过反射调用无参构造器创建一个新的对象的。
3 避免序列化破坏单例
3.1 ObjectInputStream#readObject
hasReadResolveMethod
:若实现了serializable
/externalizable
接口的类中包含readResolve
,则返回trueinvokeReadResolve
:通过反射调用要被反序列化的类的readResolve方法
3.2 解决方案
在Singleton类中定义readResolve
即可:
转载地址:https://javaedge.blog.csdn.net/article/details/105764438 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月04日 20时43分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
爱了,吹爆这个高颜值的流程图工具!
2019-04-30
一个数据项目
2019-04-30
基于JAVA_JSP电子书下载系统
2019-04-30
基于java出租车计价器设计与实现
2019-04-30
基于java的B2C的网上拍卖系统
2019-04-30
十二时辰篇:这该死的 996
2019-04-30
2021最新 上海互联网公司排名
2019-04-30
字节vs快手!取消大小周之战
2019-04-30
送一个闲置显示器!
2019-04-30
Oracle 行转列 pivot函数基本用法
2019-04-30
Oracle字符串分隔符替换(替换奇数个或偶数个)
2019-04-30
Oracle 利用 UTL_SMTP 包发送邮件
2019-04-30
Oracle 自定义函数实现split功能,支持超长字符串和clob类型的分隔
2019-04-30
Oracle 的循环中的异常捕捉和处理
2019-04-30
Oracle通过pivot和unpivot配合实现行列转换
2019-04-30
给Oracle数据库换一个1522端口的监听
2019-04-30
Excel表格数据生成ECharts图表
2019-04-30
阿里云短信服务python版,pyinstaller打包运行时缺少文件
2019-04-30
Oracle的pfile和spfile的一点理解和笔记
2019-04-30