博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射对单例模式的破坏
阅读量:6147 次
发布时间:2019-06-21

本文共 1396 字,大约阅读时间需要 4 分钟。

反射对单例模式的破坏

首先我们依旧是使用饿汉式作为测试。我们把之前写的饿汉式的代码贴上来。

public class HungrySingleton {    private final static HungrySingleton hungrySingleton;    static{        hungrySingleton = new HungrySingleton();    }    private HungrySingleton(){    }    public static HungrySingleton getInstance(){        return hungrySingleton;    }}复制代码

然后我们在测试类中使用反射来对这个单例进行攻击。

public class SingletonTest {    public static void main(String[] args) throws  ClassNotFoundException, NoSuchMethodException, IllegalAccessException {        HungrySingleton instance = HungrySingleton.getInstance();        Class
hungrySingletonClass = HungrySingleton.class; Constructor
constructor = hungrySingletonClass.getConstructor(); constructor.setAccessible(true); HungrySingleton newInstance = constructor.newInstance(); System.out.println(instance == newInstance); }复制代码

这个输出结果可想而知false。那么我们怎么样防治这种反射攻击呢?下面我们给出一种解决方案

private final static HungrySingleton hungrySingleton;    static{        hungrySingleton = new HungrySingleton();    }    private HungrySingleton(){        if(hungrySingleton != null){            throw new RuntimeException("单例构造器禁止反射调用");        }    }    public static HungrySingleton getInstance(){        return hungrySingleton;    }复制代码

我们再使用这个测试类进行测试就发现报出异常。那这是饿汉式的单例如果是懒汉式的单例呢?能否通过这种方式来实现?答案是不能。至于原因的大家想想就知道了。懒汉式一开始加载的时候成员变量是null,也就无法通过判断是否为null来阻止反射获取实例。

转载地址:http://afxya.baihongyu.com/

你可能感兴趣的文章
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
jquery的冒泡和默认行为
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
前端学习之正则表达式
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>