一、分类
类的加载都是通过 ClassLoader 来完成的,根据加载类存放在不同的位置,需要不同的ClassLoader。因此大概可以分为如下几类:
- Apk 中已经存在的类
- Apk 未存在的类(插件化实现方式)
针对上述的分类,Android 中有如下的 ClassLoader 实现:

- PathClassLoader:通常用来加载系统类和应用程序类,加载 Apk 中已经安装的 dex
- DexClassLoader:加载 dex 文件,可用来加载外部的类,在 Android8.0 之后,和 PathClassLoader 没有区别
二、双亲委托机制实现
机制的流程如下:
- 检查这个类是否被加载过,如果加载过,则直接返回
- 如果父 ClassLoader 存在,则交给父 ClassLoader 加载,否则交给 BootClassLoader 加载
- 如果父 ClassLoader 无法加载,则调用自己的 findClass 完成加载
双亲委托机制的源码如下:(伪代码)
java
protected Class<?> loadClass(String name, boolean resolve) {
synchronized (getClassLoadingLock(name)) {
// 1. 检查是否曾加载过
Class<?> c = findLoadedClass(name);
if (c == null) {
if (parent != null) {
// 2. 优先让 parent 加载器去加载
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
if (c == null) {
// 3. 如果 parent 均没有加载到目标class,调用自身的 findClass() 方法去搜索
c = findClass(name);
}
}
return c;
}
}
为什么使用双亲委托机制:
- 避免一个类被多次加载
- 安全,确保系统类 .Class 不被篡改