單例模式序列或反射破壞單例模式產生的Exception in thread "main" java.io.InvalidClassException:錯誤
阿新 • • 發佈:2021-12-13
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(); } }