简介

利用反射机制破坏了单例模式,这里以懒汉单例模式为例子进行操作。

之前利用反射也是改变了类中的private变量。

类中的private变量真的private么?

正常的单例模式的实现

这里采用了懒汉的单例模式,顺带说一句我自己对懒汉饿汉的理解:

懒汉就是在类加载的时候并不创建对象的实例,在你用到的时候才去创建一个实例。

饿汉就是不管你用不用到,这个类加载的时候就创建了一个实例。用到的时候就返回那个已经创建好的实例。

根本的区别在于创建实例的时机不同。

单例模式的类:

public class SingleTest {

private static SingleTest singleTest;

private SingleTest(){}

public static SingleTest getSingleTest()

{

if(singleTest==null)

{

singleTest = new SingleTest();

}

return singleTest;

}

}

测试类:

import java.lang.reflect.Field;

public class Test

{

public static void main(String args[])

{

SingleTest s1 = SingleTest.getSingleTest();

SingleTest s2 = SingleTest.getSingleTest();

System.out.println("s1 hashCode: "+s1.hashCode());

System.out.println("s2 hashCode: "+s2.hashCode());

}

}

这个类中我打印了s1和s2的hashCode用来验证是不是同一个对象。

输出如下:

s1 hashCode: 2943240

s2 hashCode: 2943240

可以看到s1和s2其实是同一个实例。

利用反射机制破坏单例模式

单例模式的类仍然不变。

测试类如下:

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

public class Test

{

public static void main(String args[])

{

SingleTest s1 = SingleTest.getSingleTest();

SingleTest s2 = SingleTest.getSingleTest();

SingleTest s3 = null;

System.out.println("s1 hashCode: "+s1.hashCode());

System.out.println("s2 hashCode: "+s2.hashCode());

Class singleClass = s1.getClass();

try {

Constructor constructor = singleClass.getDeclaredConstructor();

constructor.setAccessible(true);

s3 = (SingleTest) constructor.newInstance();

} catch (Exception e) {

e.printStackTrace();

}

System.out.println("s3 hashCode: "+s3.hashCode());

}

}

输出结果如下:

s1 hashCode: 18262862

s2 hashCode: 18262862

s3 hashCode: 28420709

可以看到s3和s1s2已经不是同一个实例了。

就这样,成功的破坏了单例模式。

还是一样,希望听到大家对java封装和反射等的理解。

相信能从大家的评论中学会很多。

java 反射 单例类_利用反射机制破坏单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. 单例销毁_【PHP设计模式】单例模式

    前言 设计模式是我们开发过程中的重中之重,所以今天小编就来学习设计模式中的单例模式. 单例模式 <?phpclass Singleton { /*** 定义一个静态变量保存已经实例化的对象* * ...

  3. (七)boost库之单例类

    一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问 ...

  4. 单例模式(Python中的单例类)

    目录 一.单例模式的概述 二.单例模式的优缺点 三.在Python中,单例模式有以下几种实现方式 1.通过魔法方法__new__实现 2.通过模块的导入 3.通过装饰器实现 4.通过使用类实现 一.单 ...

  5. 单例模式及单例类的两种实现

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在 ...

  6. java 防止反射_如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

  7. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  8. java中的class 类的作用_Java中Class和单例类的作用与类成员的理解

    Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...

  9. python3的配置文件类单例实现_单例模式的几种实现方式及对比

    来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...

最新文章

  1. html embed详解
  2. [娱乐]一款浅陋的C++控制台贪吃蛇小游戏
  3. MATLAB中改变默认当前文件夹
  4. redis抽奖并发_Redis优化高并发下的秒杀性能
  5. JavaWeb学习总结(十二):Session
  6. YbtOJ#20060-[NOIP2020模拟赛B组Day3]字串修改【模拟】
  7. 打开word2007总是出现配置进度_实战经验:Word 2007每次打开都弹出正在配置
  8. 内存分配(malloc()和free())
  9. codeforces166E - Tetrahedron DP
  10. 自己实现一个SQL解析引擎
  11. bash编程初体验之if
  12. ubuntu开机启动+图标配置
  13. [渝粤教育] 浙江大学 设计思维与创新设计 参考 资料
  14. 上海还有哪些比较好的IB学校?
  15. 针对于win8、win10无法访问,您可能没有权限使用网络资源的解决方法
  16. 去雾算法学习-----Automatic recovery of the atmospheric light hazy image(fattal 大气光值自适应去雾算法)阅读笔记
  17. 在vs2008中运行这个就闪退了,,还出不来结果
  18. 安装ros系统出现 404 Not Found [IP: 91.189.91.38 80]
  19. Python从入门到精通 | Python作用与定义 | 三种注释的语法(三)
  20. Java动态追踪技术

热门文章

  1. 作业帮电脑版在线使用_一起作业学生app 手机版免费在线下载
  2. java获取文件视图_springmvc-直接访问视图文件
  3. buck电路 dac stm32_STM32定时器学习---基本定时器
  4. 老年机按键串号_为什么老人机依然很多人在用?
  5. shell查询年月日(可以作为crontab判断年月日)
  6. Java基础题笔记(数组)4
  7. eclipse左边的项目栏消失的处理方法
  8. BZOJ 3524: [Poi2014]Couriers【主席树】
  9. 20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)
  10. Laravel5.5执行 npm run dev时报错,提示cross-env找不到(not found)的解决办法