单例模式序列或反射破坏单例模式产生的Exception in thread "main" java.io.InvalidClassException:错误

2021/12/13 22:20:52

本文主要是介绍单例模式序列或反射破坏单例模式产生的Exception in thread "main" java.io.InvalidClassException:错误,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

package com.itheima.pattern.singleton.demo7;


import java.io.Serializable;

public class Singleton  implements Serializable{
    //    私有构造方法
    private Singleton(){}
    //定义一个静态内部类
    private static class SingletonHolder implements Serializable {
        //在内部类中声明并初始化外部类的对象
        private static final Singleton Instance = new Singleton();
    }
    //提供一个外部的公共访问方式
    public static Singleton getInstance(){
        return SingletonHolder.Instance;
    }
//当进行反序列化时,会自动调用该方法,将该方法的返回值直接返回
//加上这个方法就不报错了
    public Object readResolve(){
        return SingletonHolder.Instance;
    }
}
package com.itheima.pattern.singleton.demo7;

import java.io.*;

/**
 * 测试使用反射破坏单例模式
 */
public class Client {
    public static void main(String[] args) throws Exception {
//        writeObject2File();
        readObjectFromFile();
//        readObjectFromFile();
    }
    //从文件读取数据(对象)
    public static void readObjectFromFile() throws Exception{
        //创建对象输入流对象
        ObjectInputStream ois =new ObjectInputStream( new FileInputStream("C:\\Users\\Administrator\\Desktop\\a.txt" ) );
        //读取对象
        Singleton instance = (Singleton) ois.readObject();
        System.out.println(instance);
        //释放资源
        ois.close();
    }

//    向文件中写数据(对象)
    public static void writeObject2File() throws Exception {
        //1.获取singleton对象
        Singleton instance =Singleton.getInstance();
        //2.创建对象输出流对象
        ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "C:\\Users\\Administrator\\Desktop\\a.txt" ) );
        //3.写对象
        oos.writeObject( instance );
        //4.释放资源
        oos.close();
    }

}

 



这篇关于单例模式序列或反射破坏单例模式产生的Exception in thread "main" java.io.InvalidClassException:错误的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程