防止Java序列化/反射破坏单例模式的解决方案
发布日期:2021-06-30 12:24:39
浏览次数:4
分类:技术文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月25日 23时36分24秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
攻防世界web进阶区web2详解
2019-04-30
xss-labs详解(上)1-10
2019-04-30
xss-labs详解(下)11-20
2019-04-30
攻防世界web进阶区ics-04详解
2019-04-30
sql注入总结学习
2019-04-30
Python 之 histogram直方图
2019-04-30
Python实现决策树 Desision Tree & 可视化
2019-04-30
决策树 Decision tree
2019-04-30
nominal和ordinal & 数据处理中四种基本数据类型
2019-04-30
Trie树(字典树)
2019-04-30
COMP7404 Machine Learing——ROC
2019-04-30
MATLAB与CUDA
2019-04-30
Linux png转jpg (convert命令)
2019-04-30
Ubuntu更新后终端中字体的颜色全是白色
2019-04-30
vscode git
2019-04-30
基于MATLAB的二进制数字调制与解调信号的仿真——2PSK
2019-04-30
基于MATLAB的模拟调制信号与解调的仿真——DSB
2019-04-30
HDU - 1166 敌兵布阵 (树状数组模板题/线段树模板题)
2019-04-30
CodeForces - 456C Boredom (dp)
2019-04-30