
禁止反射创建实例、 禁止修改破坏单例模式
仅能防止反射绕过单例机制 如果使用字节码技术修改class文件,添加额外的构造函数或方法仍然可以绕过单例机制 通过反射获取类加载器和修改类字节码仍然可能绕过单例机制
发布日期:2021-05-14 12:38:35
浏览次数:19
分类:精选文章
本文共 1132 字,大约阅读时间需要 3 分钟。
单例模式是一种常用的设计模式,其核心思想是确保一个类只能有一个实例存在。为了防止反射技术绕过单例机制,创建多个实例,我们可以通过以下方式实现单例模式的安全性:
在类加载时就创建实例 为了防止反射绕过单例机制,建议在类加载时就创建实例。这样可以确保即使有反射调用,也无法通过修改class文件创建新的实例。为此,可以在类定义时声明一个静态的实例变量,并使用静态初始化块来创建这个实例。
私有化构造函数 为了防止外部调用new运算符创建新实例,构造函数应被声明为私有。这样可以确保只有在类内部或通过特定方法获取实例时才能创建实例。
添加判断逻辑 在构造函数中添加判断逻辑,确保在类加载后不会再次创建实例。具体实现方式是在构造函数中检查是否已经存在一个实例,如果存在,则抛出异常,阻止新的实例创建。
例如,以下是实现单例模式的示例代码:
package com;public class App_one { private static int times = 0; private static App_one thisObj = new App_one(); private App_one() { if (thisObj != null) { throw new RuntimeException("单例已创建"); } else { System.out.println("创建次数" + times++); } } public App_one getInstance() { return thisObj; } public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class aClass = App_one.class; Object o = aClass.newInstance(); App_one obj = (App_one) o; }}
注意事项
因此,单例模式的实现方式并不是绝对安全,关键在于合理设计类结构和防护措施,同时根据具体需求选择适合的实现方式。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月09日 03时57分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
注册页面案例
2019-03-11
np.bincount(x)的简单解释
2019-03-11
LeetCode Top-100 T22-括号生成
2019-03-11
vscode设置eslint保存文件时自动修复eslint错误
2019-03-11
JAVA 多线程
2019-03-11
Java的 arraylist类【具体案例】
2019-03-11
牛客-链表中环的入口节点(Java)
2019-03-11
解决微信小程序中 calc 失效问题
2019-03-11
JS数组去重的方法
2019-03-11
堆的应用_topK算法和堆排序
2019-03-11
最大半连通子图
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
跳台阶
2019-03-11
另类加法,走方格的方案数,最近公共祖先
2019-03-11
线程学习5
2019-03-11
[Java Path Finder][JPF学习笔记][7]JPF输出详细程度设置
2019-03-11
GitHub完整记录数据库GHTorrent的下载和安装经验
2019-03-11
设计模式—— 三:依赖倒置原则
2019-03-11
SpringBoot打包之后乱码
2019-03-11
因SGA分配错误无法启动数据库
2019-03-11