美文网首页
防止通过反射和反序列化破坏单例

防止通过反射和反序列化破坏单例

作者: 浪里_个郎 | 来源:发表于2020-06-17 15:38 被阅读0次

不允许反射多次创建实例

    //私有化构造器中进行判断
    private XXX(){

     //多次调用,抛出异常,防止反射
        if(instane!=null){
            throw new RuntimeException();
        }

    }

不允许反序列化多次创建实例

    //反序列化时,如果自定义了readResolve()则直接返回此方法指定对象,而不需要单独创建新对象
    private Object readResolve() throws ObjectStreamException{
        return instane;
    }

P.S 我们还可以通过classloader的双亲委托机制,不使用反射而实现反射的功能。
比如我们可以在app里创建一个空的ServiceManager:

package android.os;

public class ServiceManager {
    public static IBinder getService(String name) {
        return null;
    }
}

这样,就能在代码中直接使用ServiceManager.getService了,而且由于真正的ServiceManager必然早于app被classloader加载,app中使用的就是真正的ServiceManager。

相关文章

  • 一个简单安全又好用的单例写法,你学废了吗?

    项目里使用枚举写单例: 1、简洁 写法简单 2、懒加载 3、线程安全 4、防止反序列化破坏单例 5、防止反射破坏单...

  • 设计模式——单例模式

    文章概要 1、什么是单例2、为什么需要单例3、单例的优点和缺点4、单例的写法和比较5、序列化破坏单例6、反射破坏单...

  • 防止通过反射和反序列化破坏单例

    不允许反射多次创建实例 不允许反序列化多次创建实例 P.S 我们还可以通过classloader的双亲委托机制,不...

  • java中你的单例在裸奔吗?

    在上一篇文章java中你确定用对单例了吗?中提到单例可以被恶意的破坏,如序列化破坏和反射破坏单例的结构,好的,这个...

  • 深度解析单例与序列化之间的爱恨情仇~

    本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,...

  • 单例与序列化的那些事儿

    本文将通过实例+阅读Java源码的方式介绍序列化是如何破坏单例模式的,以及如何避免序列化对单例的破坏。 单例模式,...

  • 反射的破坏性

    如何防止反射破坏单例? 参考:https://www.jianshu.com/p/5f529f18821a基于单例...

  • 枚举实现单例模式

    枚举实现单例模式 前面我们说到序列化和反序列化以及反射对单例都是有破坏的,下面我们介绍一种更加优雅的实现,也是ef...

  • 序列化破坏单例&反射破坏单例

    反序列化破坏单例 为什么写了readResolve方法,反序列化就不会破坏单例呢?原因如下:ObjectInput...

  • 单例模式

    由于性能问题,优化,采用双重检查锁 懒汉式内部类单例 枚举类从JDK层面就保证不能被序列化和反射所破坏单例模式 枚...

网友评论

      本文标题:防止通过反射和反序列化破坏单例

      本文链接:https://www.haomeiwen.com/subject/blssxktx.html