`
buaixianchen
  • 浏览: 24093 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Singleton与readResolve

 
阅读更多
@SuppressWarnings("serial")
public class OnlySingleton implements Serializable {
	private static OnlySingleton singleton = new OnlySingleton();
	private OnlySingleton() {}
	public static OnlySingleton getInstance() {
		return singleton;
	}
	
	/**
	 * 反序列化时内存Hook这段代码 
	 * @return
	 */
	private Object readResolve() {
		return singleton;
	}
}
 
public class SingletonSerializableTest {

	@Test
	public void testSingletonSerializable() throws IOException, ClassNotFoundException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		OnlySingleton singleton = OnlySingleton.getInstance();
		oos.writeObject(singleton);
		
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		OnlySingleton clone = (OnlySingleton) ois.readObject();
		System.out.println(singleton);
		System.out.println(clone);		
	}
	
}
 
分享到:
评论

相关推荐

    Singleton

    可以通过实现Serializable接口并重写readResolve()方法来解决这个问题。 此外,Singleton模式虽然简单易用,但也有一些缺点,如违背了开闭原则(对扩展开放,对修改关闭),导致程序难以进行单元测试,以及在某些多...

    深入浅出单例Singleton模式

    2. **序列化**:如果单例类实现了`Serializable`接口,需要处理反序列化时可能创建新实例的问题,通常在`readResolve()`方法中返回现有实例。 3. **懒汉式与饿汉式**:懒汉式(延迟初始化)在类加载时不创建实例,...

    singleton.zip单例的几种实现demo,

    7. **序列化与反序列化**: 如果单例实现了`Serializable`接口,那么在反序列化时会创建新的实例。为了解决这个问题,可以添加`readResolve()`方法: ```java public class Singleton implements Serializable { ...

    Java Singleton 实用教程(附源码)

    在实际开发中,我们还需要考虑反序列化和反射攻击破坏单例的情况,通常会在构造函数上添加`private`修饰符并使用`readResolve()`方法或`equals()`和`hashCode()`方法来防止这种情况发生。 总结起来,Java单例模式的...

    Singleton.zip

    3. 考虑到反序列化和反射攻击,使用枚举类型或添加私有构造函数和`readResolve()`方法可以防止非法创建多个实例。 4. 在多线程环境下,必须确保单例的线程安全性。 通过这个"Singleton.zip"文件,你可以学习到如何...

    Java单例模式设计

    为了防止这种情况,我们需要在Singleton类中实现`readResolve()`方法: ```java import java.io.ObjectStreamException; public class Singleton implements Serializable { // ... protected Object ...

    最全的单例模式j(java实现),下到就是赚到!

    单例模式是软件设计模式中的一种...此外,注意在设计时考虑反序列化或反射攻击,可以使用`readResolve()`或`clone()`方法来避免创建额外的实例。学习并理解这些单例模式,对于提高代码质量,减少资源浪费具有重要意义。

    7种单例模式

    private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 2. **懒汉式单例(线程不安全)**: 实例在首次...

    java单例模式代码实例

    与静态常量类似,但在类加载时初始化,线程安全,但可能导致资源浪费。 ```java public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton...

    设计模式之单例

    1. **防止反序列化创建新实例**:默认情况下,Java序列化会破坏单例,可以通过实现 `readResolve()` 方法来解决这个问题。 2. **线程安全**:确保在多线程环境下,单例的实例化过程是线程安全的。 3. **懒加载与初始...

    340.338.JAVA基础教程_面向对象(下)-复习:单例模式(340).rar

    需要注意的是,当单例模式与序列化结合时,如果不做特殊处理,反序列化可能会创建新的实例,破坏单例的特性。可以通过实现readResolve()方法来解决这个问题。 在实际开发中,除了了解如何实现单例,还需要考虑何时...

    JAVA23中设计模式精讲

    另外,使用不同类加载器加载同一类会导致多个单例存在,而序列化和反序列化也可能破坏单例,除非正确处理readResolve()或writeReplace()方法。 总之,单例模式是一种强大的设计模式,但使用时需谨慎,特别是在多...

    单例模式介绍

    private static final StaticSingleton INSTANCE = new StaticSingleton(); private StaticSingleton() {} public static StaticSingleton getInstance() { return INSTANCE; } } ``` 2. 懒汉式单例(Lazy...

    22种开发模式

    对象序列化之后再反序列化时会生成新的对象,因此当 Singleton 单类模式类实现序列化接口时,必须显式声明所有的字段为 transient,并且提供 readResolve 方法来防止通过序列化破坏单态模式。 除了饱汉模式和饿汉...

    设计模式之单例模式

    因为单例类通常与具体业务紧密耦合,添加新功能时可能需要修改单例类。 总的来说,单例模式是一种实用的设计模式,但在使用时应谨慎考虑其适用场景,避免滥用。在多线程和并发环境下,需特别注意线程安全问题。同时...

    单例设计模式个人总结+摘录

    ### 单例设计模式概述与实现方式 单例设计模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在多种编程语言中都有应用,尤其适用于资源消耗较大的对象或者需要频繁访问共享...

    Java的单例设计模式

    为此,可以在单例类中添加`readResolve()`方法来返回唯一的实例。 总的来说,Java的单例设计模式是一种强大的工具,可以帮助我们有效地管理全局资源,提高系统的效率和稳定性。正确理解和使用单例模式,对于提升...

    单例模式详解

    - 考虑到序列化和反序列化可能导致单例模式失效,可以重写`readResolve()`方法来解决这个问题。 总的来说,单例模式是一种有效的设计模式,能够有效地管理资源和提供全局访问点,但在使用时需要注意线程安全以及...

    android单例

    1. **序列化与反序列化**:如果单例类实现了`Serializable`接口,那么在反序列化时会生成新的实例。为了避免这种情况,我们需要在单例类中添加`readResolve()`方法。 2. **反射攻击**:通过反射调用私有构造函数也...

Global site tag (gtag.js) - Google Analytics