不允许反射多次创建实例
//私有化构造器中进行判断
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。
网友评论