美文网首页
反射对单例模式的破坏

反射对单例模式的破坏

作者: 三不猴子 | 来源:发表于2018-12-25 20:46 被阅读6次

反射对单例模式的破坏

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

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<HungrySingleton> hungrySingletonClass = HungrySingleton.class;
        Constructor<HungrySingleton> 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来阻止反射获取实例。

相关文章

  • 反射破坏单例模式(静态内部类)

    java反射,破坏单例模式 静态内部类 反射实例化单例

  • 反射(三)

    反射(三) 反射还可能会破坏单例模式,单例模式的特征: 私有化构造方法 提供全局唯一的公有访问点 以懒汉模式为例,...

  • 反射对单例模式的破坏

    反射对单例模式的破坏 首先我们依旧是使用饿汉式作为测试。我们把之前写的饿汉式的代码贴上来。 然后我们在测试类中使用...

  • 反射对单例模式的破坏

    预防反射攻击的方式是在私有构造函数过程中进行非null判断

  • java中你的单例在裸奔吗?

    在上一篇文章java中你确定用对单例了吗?中提到单例可以被恶意的破坏,如序列化破坏和反射破坏单例的结构,好的,这个...

  • 深度解析单例与序列化之间的爱恨情仇~

    本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,...

  • 单例与序列化的那些事儿

    本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,...

  • 单例模式推荐写法--枚举实现单例

    小小的单例模式看着简单,其实里面道道着实不少。不仅要在多线程下保证实例唯一,也要能抵御序列化以及反射对单例的破坏。...

  • 设计模式——单例模式

    文章概要 1、什么是单例2、为什么需要单例3、单例的优点和缺点4、单例的写法和比较5、序列化破坏单例6、反射破坏单...

  • 枚举实现单例模式

    枚举实现单例模式 前面我们说到序列化和反序列化以及反射对单例都是有破坏的,下面我们介绍一种更加优雅的实现,也是ef...

网友评论

      本文标题:反射对单例模式的破坏

      本文链接:https://www.haomeiwen.com/subject/efyqlqtx.html