return c;
}
2、在loadClass方法中,首先会去检查是否已经加载过,如果加载过c不为空则直接返回;如果没有加载过先去调用parent的loadclass方法,这样就会递归调用父加载器(父加载器是在创建加载器的时候作为参数传进来的),如果parent为空,就会去调用BootClassLoader;如果在所有父加载器中都没有成功加载,才会调用自己的findclass方法自己加载;
protected Class<?> findClass(String name) throws ClassNotFoundException {
Class c = pathList.findClass(name, suppressedExceptions);
return c;
}
3、ClassLoader类中的findClass是一个空实现,实际调用的是BaseDexClassLoader中的findClass方法,我们在方法中可以看实现非常简单,就是调用了DexPathList的findClass方法:
public Class<?> findClass(String name, List suppressed) {
for (Element element : dexElements) {
Class<?> clazz = element.findClass(name, definingContext, suppressed);
if (clazz != null) {
return clazz;
}
}
return null;
}
4、在这个方法中,会去循环遍历dexElements,然后调用Element的findClass方法;那么这个dexElements是啥呢?在DexPathList构造方法中对其进行了赋值:
public DexPathList(ClassLoader definingContext, String dexPath,
String librarySearchPath, File optimizedDirectory) {
// save dexPath for BaseDexClassLoader
this.dexElements = makeDexElements(splitDexPath(dexPath),