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

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

作者: 浪里_个郎 | 来源:发表于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。

    相关文章

      网友评论

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

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