单例模式的破解 (反射及序列化方式)

1.通过反射破解单例

	     Class clazz =  Class.forName("com.lwk.singleton.SingletonDemo2");
	     Constructor<SingletonDemo2> c = clazz.getDeclaredConstructor(null);
	     c.setAccessible(true);
	     SingletonDemo2 s3 = c.newInstance();

阻止反射破解单例

改造构造方法

  private SingletonDemo2() {
    	 if(instance != null){
    		 throw new RuntimeException();
    	 }
  }
2.通过反序列化破解单例

前提是单例实现序列化

public class SingletonDemo2 implements Serializable

             ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/a.text"));
	     oos.writeObject(s1);;
	     oos.close();
	     
	     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.text"));
	     SingletonDemo2 s3 = (SingletonDemo2) ois.readObject();
阻止反序列化破解单例

在单例类里面添加如下方法

public Object readResolve(){
    	 return instance;
}
反序列化时直接通过该方法返回对象,不再创建单独的对象






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值