【Java】反射与单例
来源:互联网 发布:c 结构体数组 编辑:程序博客网 时间:2024/06/05 02:11
双重检验与静态内部类两种方法都可以实现延迟加载的单例模式。但是无法阻止反射破坏单例,因为反射可以无视修饰权限,直接调用构造方法创建对象,下面是一个例子:
package ThreadTest;public class Singleton {private Singleton(){} static class SingletonGen{private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonGen.instance;}public static void main(String args[]){Singleton s = Singleton.getInstance();try {Class clazz = Class.forName("ThreadTest.Singleton");Singleton sss = (Singleton) clazz.newInstance();System.out.println(s.hashCode());System.out.println(sss.hashCode());} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}最终两个对象的hashcode不同,说明是两个对象。
那么如何解决反射破坏呢?可以类内创建一个标志变量,在构造方法内部检测该标志变量,使得构造方法只执行一次。但是这个检测必须 是线程安全的,必须同步,那么是类锁还是对象锁?很显然是类锁,因为多线程中的反射是以类为单位进行的,所以需要类锁。
private static boolean flag = false;private Singleton(){synchronized (Singleton.class) {if(!flag){flag = true;}else{throw new RuntimeException("单例被破坏");}}}
这样,不论以什么方式,只要是通过构造方法来破坏单例,都会被阻止。
阅读全文
0 0
- 【Java】反射与单例
- 单例与反射
- 反射、枚举与单例
- java反射技术破坏单例模式
- java反射技术-----破坏单例模式
- java反射破坏单例模式
- 黑马程序员——反射与单例设计模式
- 单例模式,基于Java反射机制的实现
- Java结合反射和单例的工厂模式
- 如何防止单例模式被JAVA反射攻击
- 如何防止单例模式被JAVA反射攻击
- 如何防止单例模式被JAVA反射攻击
- 如何防止单例模式被JAVA反射攻击
- 如何防止单例模式被JAVA反射攻击
- 如何防止单例模式被 JAVA 反射攻击
- Java单例防反序列化,防反射,防clone
- Java基础---单例模式 观察者模式 反射 工厂模式
- 通过java反射机制,获取单例模式中的方法
- MySQL关联关系
- Java基本类型的自动装箱与自动拆箱
- 感觉有点寂寞
- 爬虫实战
- C#开发教程--线条绘制篇
- 【Java】反射与单例
- leetcode13题解
- 我的学习之路_bootstrap
- 什么时候使用CountDownLatch
- git常用命令
- The Suspects (并查集)
- MySQL为关联表添加数据
- [机器学习]基于 JavaScript 的机器学习实例
- StringUtils在commons-lang3和commons-lang中的区别