Java单例模式的终结者
发布日期:2021-06-30 11:12:44
浏览次数:3
分类:技术文章
本文共 2666 字,大约阅读时间需要 8 分钟。
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址: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() { Classclazz=SingletonInstance.class; try { // 获取私有构造函数 Constructor 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://it9527.blog.csdn.net/article/details/110940777 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月09日 18时20分00秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
架构设计 异步处理流程,多种实现模式详解
2019-04-30
架构设计 接口幂等性原则,防重复提交Token管理
2019-04-30
架构设计 高并发流量削峰,共享资源加锁机制
2019-04-30
架构设计 分布式系统调度,Zookeeper集群化管理
2019-04-30
数据源管理 (一)
2019-04-30
数据源管理(二)
2019-04-30
数据源管理(三)
2019-04-30
数据源管理(四)
2019-04-30
数据源管理(五)
2019-04-30
数据源管理(六)
2019-04-30
数据源管理(七)
2019-04-30
数据源管理(八)
2019-04-30
分布式服务与库表设计
2019-04-30
Css布局口诀
2019-04-30
超详细常用css布局
2019-04-30
css 各种常见布局整理
2019-04-30
CSS布局大全
2019-04-30
超干货 CSS3/SVG Loading动画集合
2019-04-30
Python黑帽 获取注册表、U盘历史痕迹和回收站文件
2019-04-30
C++读取配置文件代码
2019-04-30