您当前的位置: 首页 >  spring

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Spring 源码解析之 反射破解单例模式

java持续实践 发布时间:2021-03-06 20:09:22 ,浏览量:1

文章目录
      • 为什么要用单例模式
      • 常见的单例模式的写法
      • 反射破解单例模式

为什么要用单例模式

需要同一个容器, 将所有的目标对象管理起来, 容器需要用单例来实现, 因此就要用到单例模式.

常见的单例模式的写法

常见的单例模式, 一般分为懒汉式和饿汉式. 饿汉式的写法 https://javaweixin6.blog.csdn.net/article/details/108435222

懒汉式的写法 https://javaweixin6.blog.csdn.net/article/details/108435929

反射破解单例模式

在上面提到的懒汉式和饿汉式中, 都可以通过反射来破解单例模式 例子如下 懒汉式的单例模式写法

public class Singleton {

    private volatile static Singleton singleton ;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    return new Singleton();
                }
            }
        }
        return singleton;
    }
}

写一个单元测试类如下

   @Test
    public void getInstanceTest() throws Exception {
        // 通过调用静态方法创建对象
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);

        // 通过反射创建对象
        Class singletonClass = Singleton.class;
        Constructor constructor = singletonClass.getDeclaredConstructor();
        constructor.setAccessible(true);
        Singleton singleton = constructor.newInstance();
        System.out.println(singleton);
    }

打印如下 , 打印出了两个对象 , 代表反射可以破解其单例模式 在这里插入图片描述

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0380s