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

239 阅读1分钟

@[toc]

为什么要用单例模式

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

常见的单例模式的写法

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

懒汉式的写法 javaweixin6.blog.csdn.net/article/det…

反射破解单例模式

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

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<Singleton> singletonClass = Singleton.class;
        Constructor<Singleton> constructor = singletonClass.getDeclaredConstructor();
        constructor.setAccessible(true);
        Singleton singleton = constructor.newInstance();
        System.out.println(singleton);
    }

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