effectivejava(破壞單例)
阿新 • • 發佈:2020-08-05
以下程式碼是最普通的雙重鎖的單例實現形式
package com.edu.character02; import java.io.Serializable; /** * <p> * 雙重鎖 * </P> * * @作者 five-five * @建立時間 2020/8/5 */ public class SingleTon implements Serializable { private static SingleTon instance; public static SingleTon getInstance() { if (instance == null) { synchronized (SingleTon.class) { if (instance == null) { instance = new SingleTon(); } } } return instance; } private SingleTon() { } }
下面是兩種破壞單例的方案
1.通過反射的形式
package com.edu.character02;import java.lang.reflect.Constructor; /** * <p> * 反射破壞單例 * </p> * * @作者 five-five * @建立時間 2020/8/5 */ public class DamageSingleTonByReflect { public static void main(String[] args) throws Exception { SingleTon s1 = SingleTon.getInstance(); Class<? extends SingleTon> aClass = s1.getClass(); Constructor<? extends SingleTon> constructor = aClass.getDeclaredConstructor(); constructor.setAccessible(true); SingleTon singleTon = constructor.newInstance(); System.out.println(s1); System.out.println(singleTon); System.out.println(s1.hashCode()); System.out.println(singleTon.hashCode()); System.out.println(singleTon == s1); } }
測試結果如圖:
2.通過序列化的形式
package com.edu.character02; import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import java.io.*; /** * <p> * 破壞單例 * </p> * @作者 five-five * @建立時間 2020/8/5 */ public class DamageSingleTonBySerializable { public static void main(String[] args) { SingleTon s1=null; SingleTon s2=SingleTon.getInstance(); FileOutputStream fos=null; ObjectOutputStream oos=null; FileInputStream fis=null; ObjectInputStream ois=null; try { fos=new FileOutputStream("SingleTon.obj"); oos=new ObjectOutputStream(fos); oos.writeObject(s2); oos.flush(); oos.close(); fis=new FileInputStream("SingleTon.obj"); ois = new ObjectInputStream(fis); s1= (SingleTon) ois.readObject(); ois.close(); System.out.println(s1); System.out.println(s2); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s1==s2); } catch (Exception e) { e.printStackTrace(); } } }
測試結果如圖: