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

2020-06-17  本文已影响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。

上一篇 下一篇

猜你喜欢

热点阅读