反射破坏单例
上面我们介绍的单例模式的构造方法除了加private的关键字,没有做任何处理,如果我们使用反射来调用其构造方法,在调用getInstance()方法,应该会有两个不同的实例,现在我们来测试一段代码:
public static void main(String[] args) throws NoSuchMethodException {
try {
Class cl = LazyStaticInnerClassSingleton.class;
//获取构造方法
Constructor constructor = cl.getDeclaredConstructor(null);
//强制访问
constructor.setAccessible(true);
//初始化
Object o = constructor.newInstance();
System.out.println(o);
Object o1 = constructor.newInstance();
System.out.println(o1);
}catch(Exception e){
e.getMessage();
}
}
运行结果如下图所示:
创建了两个不同的实例。
解决方法:
我们在起构造方法中做一些限制,一旦出现多次重复创建,直接抛出异常。