反射如何破坏单例模式
来源:互联网 发布:虚拟歌姬软件 编辑:程序博客网 时间:2024/06/05 00:59
一个单例类:
public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }}
通过反射破坏单例模式:
public class Test { public static void main(String[] args) throws Exception{ Singleton s = Singleton.getInstance(); Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor(); constructor.setAccessible(true); Singleton s2 = constructor.newInstance(); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); }}输出结果:18319327241747585824
结果表明s1和s2是两个不同的实例了。
通过反射获得单例类的构造函数,由于该构造函数是private的,通过setAccessible(true)指示反射的对象在使用时应该取消 Java 语言访问检查,使得私有的构造函数能够被访问,这样使得单例模式失效。
如果要抵御这种攻击,要防止构造函数被成功调用两次。需要在构造函数中对实例化次数进行统计,大于一次就抛出异常。
public class Singleton { private static int count = 0; private static Singleton instance = null; private Singleton(){ synchronized (Singleton.class) { if(count > 0){ throw new RuntimeException("创建了两个实例"); } count++; } } public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } public static void main(String[] args) throws Exception { Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor(); constructor.setAccessible(true); Singleton s1 = constructor.newInstance(); Singleton s2 = constructor.newInstance(); }}执行结果:Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.yzz.reflect.Singleton.main(Singleton.java:33)Caused by: java.lang.RuntimeException: 创建了两个实例 at com.yzz.reflect.Singleton.<init>(Singleton.java:14) ... 5 more
在通过反射创建第二个实例时抛出异常,防止实例化多个对象。构造函数中的synchronized是为了防止多线程情况下实例化多个对象。
0 0
- 反射如何破坏单例模式
- 反射如何破坏单例模式
- 反射如何破坏单例模式
- 如何破坏单例模式?
- java反射技术破坏单例模式
- java反射技术-----破坏单例模式
- java反射破坏单例模式
- 序列化 反射破坏单例模式
- 如何破坏单例模式?如何防止?
- 破坏单例模式
- 使用反射破坏和管理单例模式
- 反射 序列化 克隆对单例模式的破坏
- 单例设计模式及反射机制破坏
- 如何粗鲁地破坏一个单例模式
- 破坏java 单例模式
- java单例模式详解完美实现(包括反射破坏的防止和线程安全)
- 反射如何破坏
- 让我们来破坏单例模式
- SHOWSYNTAX --目标端显示sql重构
- SMTP协议详解
- Timestamp类型使用小结
- 实现图片轮播的几种方法
- 2016/11/11学习工作日志
- 反射如何破坏单例模式
- 【noip2013提高组day1T3】 货车运输 RMQ+LCA+倍增+最大生成树
- 常用正则表达式归纳
- 2>&1 的用法说明
- iOS开发 ☞ 图片处理
- js中的fromCharCode() charCodeAt() charAt()
- C语言系列(五)内存的分配与释放
- noip2013 华容道 bfs+建图
- Linux学习--gdb调试