java反射破坏单例模式

Java反射机制可以破坏单例模式

先看当前的单例模式写法

public class Demo4 {
     
    private Demo4() {
     }
    private static class innerClass {
     
        private static final Demo4 instance = new Demo4();
    }
    public static Demo4 getInstance() {
     
        return innerClass.instance;
    }
}

这里用一个 静态内部类来获取单例就不会造成资源浪费

测试

class test4{
     
    public static void main(String[] args) throws Exception {
     
        Demo4 sinleton = Demo4.getInstance();
        Demo4 sinleton2 = Demo4.getInstance();
        System.out.println(sinleton == sinleton2);

//        反射可以   破坏private
        Constructor<Demo4> demo4Constructor = Demo4.class.getDeclaredConstructor(null);
        demo4Constructor.setAccessible(true);
        Demo4 sington3 = demo4Constructor.newInstance();
        System.out.println(sinleton == sington3);

    }
}

如代码这样 获取构造函数后设置 setAccessible 为 true 就表示可以访问 对象中的private方法和private属性

所以 前两个通过getInstance()获取的对象是一样的 后面通过反射获取的对象是不一样的

结果

true
false

Process finished with exit code 0

你可能感兴趣的:(设计模式,java,反射,设计模式)