单例模式防止反射和反序列化

public class SingletonDemo5 implements Serializable{
private static SingletonDemo5 instance;
//防止单例被反射
private SingletonDemo5(){
if(null!=instance){
throw new RuntimeException("不能被反射");
}
}
/* public static synchronized SingletonDemo2 getInstance(){

if(null==instance){
return instance=new SingletonDemo2();
}

return instance;
}*/
//资源不够优化,可以进行双重检查,注释部分
public static SingletonDemo5 getInstance(){
//双重检查,提高效率
if(null==instance){
synchronized (SingletonDemo5.class) {
if(null==instance){
instance=new SingletonDemo5();
}

}

}

return instance;
}
//当反序列化的时候,直接调用当前的对象
private Object readResolve(){
return instance;
}
}

public class Test2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SingletonDemo5 s1=SingletonDemo5.getInstance();
SingletonDemo5 s2=SingletonDemo5.getInstance();
System.out.println(s1);
System.out.println(s2);

//注释  readResolve()方法的时候
//s1 [email protected]
//s2 [email protected]
//s3 [email protected]
File file=new File("d:/a.txt");
FileOutputStream fos=new FileOutputStream(file);
ObjectOutputStream os=new ObjectOutputStream(fos);
os.writeObject(s1);
ObjectInputStream is=new ObjectInputStream(new FileInputStream(file));
SingletonDemo5 s3=(SingletonDemo5) is.readObject();
System.out.println(s3);
}
}

//没注释 readResolve()方法的时候

//s1 [email protected]

//s2 [email protected]

//s3 [email protected]

前面是防止反序列化,如果要防止反射的话可以在构造器中抛出异常

时间: 2024-11-06 23:26:53

单例模式防止反射和反序列化的相关文章

单例模式破解之反射和反序列化

5种单例模式中除了枚举式,其他都存在反射和反序列化的漏洞,下面来讲述一下: 下面是破解代码: /** * * 描述:测试反射和反序列化破解单例模式Demo06 * @author cookie */ public class Client { public static void main(String[] args) throws Exception { SingletonDemo06 s1 = SingletonDemo06.getInstance(); SingletonDemo06 s2

单例模式防反射及性能(二)

单例模式的目的是创建一个对象,但是反射的方式,或者使用反序列的方式,就会对这种目的造成威胁,那么我们先来看看如何使用反射,如何使用反序列化,创建构造函数私有化的对象,以及我们如何防止反序列化创建对象. 1.补充:如何选用单例模式 (1)占用资源少,不需要延迟加载的,一般使用的是枚举和饿汉式,但是枚举比饿汉式安全. (2)占用资源大,需要延迟加载,一般使用静态内部类和懒汉式,静态内部类好于懒汉式,因为他更加的懒汉式.线程安全.调用的效率高. 2.使用反射破解的时候,一般是不包括枚举的,所以他的安全

(单例设计模式之一)饿汉式的反射与反序列化漏洞

1.闲话少说,直接上代码. import java.io.Serializable;//饿汉式public class Singleton01 implements Serializable{    //1.私有的属性    private static Singleton01 instance=new Singleton01();    //2.私有的构造器    private Singleton01(){}    //3.共有的get()方法    public static  Singl

【GOF23设计模式】单例模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式  2.单例模式  3.饿汉式  1 package com.test.singleton; 2 /** 3 * 测试饿汉式单例模式 4 */ 5 public class SingletonDemo01 { 6 7 //类初始化时,立即加载这个对象(没有延时加载的优势).加载类时,天然的是线程安全的! 8 private static SingletonDem

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

GOF23—单例模式(1)

核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 常见的应用场景: 1.Windows的Task Manager(任务管理器) 2.windows的Recycle Bin(回收站) 3.项目中,读取配置文件的类,一般也只有一个对象,没有必要每次使用配置文件数据,每次new一个对象去读取. 4.网站的计数器,也是采用单例模式,这样可以实现同步 5.应用程序的日志应用,一般都采用单例模式进行实现,因为共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加.

设计模式(一)单例模式

单例模式:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 优点:1. 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置.产生其他依赖对象时,则可以通过在应用启动时产生一个单例对象,然后永久驻留内存的方式来解决. 2. 单例模式可以在系统设置全局的访问点,例如可以设计一个单例类,负责所有数据表的映射处理. 常见的五种单例模式实现方式: 饿汉式:线程安全,调用效率高.但是,不能延时加载. 懒汉式:线程安全,调用效率不高.但是,可以延时加载.

五种单例模式

今天算是完完整整把老高的单例模式看了,差不多也懂了,个别不懂的再补吧,下面介绍一下5种单例模式: 饿汉式实现:线程安全,调用效率高.但是,不能延时加载. 懒汉式实现:线程安全,调用效率不高.但是,可以延时加载. 双重检测锁式:由于JVM底层内部模型原因,偶尔会出现问题,不建议使用. 静态内部类式:线程安全,调用效率高,可以延时加载. 枚举式:线程安全,调用效率高.但是,不能延时加载(避免反射和反序列化的漏洞). 以下先介绍一下5种单例模式: 饿汉式实现: /** *单例模式:饿汉模式 *线程安全

Java设计模式学习01——单例模式(转)

原地址:http://blog.csdn.net/xu__cg/article/details/70182988 Java单例模式是一种常见且较为简单的设计模式.单例模式,顾名思义一个类仅能有一个实例,并且向整个系统提供这一个实例. 单例模式的特点: 单例类仅能有一个实例. 单例类必须为自己创建实例. 单例类必须向外界提供获取实例的方法. 以下是几种实现方法 一.懒汉式单例(能够延时加载) public class SingleTon { private static SingleTon ins