1.本题中使用破解懒汉模式,代码如下:
package com.xb.golf4;
/**
* 利用反射和反序列化破解单例(不包括枚举)模式
*懒汉式
* @author XieBin
*
*/
public class SingletonDemo02 {
private static SingletonDemo02 instance;
//构造器私有化
private SingletonDemo02(){
}
//公共的静态方法获取单例对象,加了同步控制,效率较低,有延迟加载
public static synchronized SingletonDemo02 getInstance(){
if(instance==null){
instance=new SingletonDemo02();
}
return instance;
}
}
2.测试代码如下:
package com.xb.golf4;
import java.lang.reflect.Constructor;
/**
* 单例模式测试
* @author Xiebin
*
*/
public class Test {
public static void main(String[] args) throws Exception {
SingletonDemo02 singleton01=SingletonDemo02.getInstance();
SingletonDemo02 singleton02=SingletonDemo02.getInstance();
System.out.println(singleton01==singleton02);
System.out.println(singleton01);
System.out.println(singleton02);
Class<SingletonDemo02> instance01= (Class<SingletonDemo02>) Class.forName("com.xb.golf4.SingletonDemo02");
Constructor<SingletonDemo02> declaredConstructor = instance01.getDeclaredConstructor();
//设置可以访问的权限,原因是:构造器为私有化
declaredConstructor.setAccessible(true);
SingletonDemo02 newInstance = declaredConstructor.newInstance();
System.out.println(newInstance);
}
}
3.结果如下:
4.生成了一个新的对象,如何防止这种情况的发生,可以在构造器中添加判断。
这样就可已防止通过反射创建新的对象