Java单例模式的终结者
程序员文章站
2022-03-21 08:41:40
我们都知道:单例模式的核心在于通过该类只能创建一个对象;就算多次创建所获得的对象均是同一个。有没有办法让一个单例类创建出不同的对象呢?答案是肯定的。今天,我们就来通过反射技术终结单例模式!...
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
概述
我们都知道:单例模式的核心在于通过该类只能创建一个对象;就算多次创建所获得的对象均是同一个。有没有办法让一个单例类创建出不同的对象呢?答案是肯定的。今天,我们就来通过反射技术终结单例模式!
单例模式回顾
我们先来回顾一下单例模式。
代码如下:
package com.singleton4;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
* 示例描述:单例设计模式之懒汉式
*/
public class SingletonInstance {
private static SingletonInstance instance = null;
private SingletonInstance() {
}
public static synchronized SingletonInstance getInstance() {
if (instance == null) {
instance = new SingletonInstance();
}
return instance;
}
}
测试代码:
package com.singleton4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
* 示例描述:利用反射技术破坏单例模式
*/
public class SingletonDemo {
public static void main(String[] args) {
testSingleton1();
}
public static void testSingleton1() {
SingletonInstance instance1 = SingletonInstance.getInstance();
SingletonInstance instance2 = SingletonInstance.getInstance();
System.out.println(instance1);
System.out.println(instance2);
System.out.println(instance1==instance2);
}
}
结果如下:
反射技术与单例模式
接下来,我们使用反射技术终结单例模式。
代码如下:
package com.singleton4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
* 示例描述:利用反射技术破坏单例模式
*/
public class SingletonDemo {
public static void main(String[] args) {
testSingleton2();
}
public static void testSingleton1() {
SingletonInstance instance1 = SingletonInstance.getInstance();
SingletonInstance instance2 = SingletonInstance.getInstance();
System.out.println(instance1);
System.out.println(instance2);
System.out.println(instance1==instance2);
}
public static void testSingleton2() {
Class<SingletonInstance> clazz=SingletonInstance.class;
try {
// 获取私有构造函数
Constructor<SingletonInstance> declaredConstructor = clazz.getDeclaredConstructor();
// 取消安全性检查
declaredConstructor.setAccessible(true);
try {
// 创建对象
SingletonInstance instance1 = declaredConstructor.newInstance();
SingletonInstance instance2 = declaredConstructor.newInstance();
System.out.println(instance1);
System.out.println(instance2);
System.out.println(instance1==instance2);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
结果如下:
本文地址:https://blog.csdn.net/lfdfhl/article/details/110940777