本文学习的源码参考AndroidXRef,版本为Lollipop 5.1.0_r1。
前面我们讲了ClassLoader的构造函数是怎么实现的,现在来看下具体类加载的实现吧。
在Android中,我们使用loadClass方法来加载我们需要的类,但是在PathClassLoader和DexClassLoader,以及他们的父类BaseDexClassLoader中都没有定义loadClass方法,那么最终调用还是父类ClassLoader中的loadClass方法。
public Class<?> loadClass(String className) throws ClassNotFoundException {
return loadClass(className, false);
}
protected Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException {
Class<?> clazz = findLoadedClass(className);
if (clazz == null) {
ClassNotFoundException suppressed = null;
try {
clazz = parent.loadClass(className, false);
} catch (ClassNotFoundException e) {
suppressed = e;
}
if (clazz == null) {
try {
clazz = findClass(className);
} catch (ClassNotFoundException e) {
e.addSuppressed(suppressed);
throw e;
}
}
}
return clazz;
}
有两个方法,loadClass(String className)
本质上还是调用了loadClass(Strin