在Android中,双亲委派机制(也称为双亲委托机制)是类加载器加载类时遵循的一种层次结构和安全机制。以下是双亲委派机制在Android中工作的详细解释:
1. 定义
双亲委派机制是指当一个类加载器收到一个类加载请求时,它首先会把这个请求委派给父类加载器去完成,每个类加载器都是如此。这种机制确保了Java核心类的唯一性和安全性。
2. 工作流程
- 当一个类加载器(如Application ClassLoader)收到一个类加载请求时,它首先会检查该类是否已经被加载过,如果已经加载过,则直接返回已加载的类;否则进入下一步。
- 类加载器会将加载请求委派给其父类加载器(如Extension ClassLoader)。
- 父类加载器会检查自己是否已经加载过该类,如果已经加载过,则直接返回已加载的类;否则继续向上委派给更上一层的父类加载器(如Bootstrap ClassLoader)。
- 顶级父类加载器(Bootstrap ClassLoader)会尝试在Java的核心类库(如
<JAVA_HOME>\lib)中加载该类。 - 如果Bootstrap ClassLoader加载失败(即在核心类库中未找到所需类),则会将加载请求逐级向下交还给子类加载器(如Extension ClassLoader、Application ClassLoader)去尝试加载。
- 如果子类加载器在自己的搜索范围内找到了该类,则进行加载;如果所有类加载器都无法加载该类,则会抛出
ClassNotFoundException异常。
3. 优点
- 沙箱安全机制:防止核心API库被随意篡改,确保Java核心类的唯一性和安全性。
- 避免类的重复加载:当父亲已经加载了该类时,子加载器就没有必要再加载一次,保证被加载类的唯一性。
4. 类加载器类型
- Bootstrap ClassLoader:启动类加载器,用于加载Android Framework层class文件。
- Extension ClassLoader:扩展类加载器,用于加载扩展jar包中的class文件。
- Application ClassLoader(也称为PathClassLoader):应用程序类加载器,用于加载应用程序的class文件。
- DexClassLoader:用于加载指定的dex文件,以及jar、zip、apk中的classes.dex文件。
5. 总结
双亲委派机制是Android中类加载器加载类时遵循的一种重要机制,它确保了Java核心类的唯一性和安全性,并避免了类的重复加载。通过层次化的类加载器结构,Android实现了对类加载的灵活管理和控制。