双亲委托机制
自己先加载,加载到返回class,加载不到让父类加载,如此往复,最后还是加载不到,抛出异常。
好处
高效:父类加载一次就可以避免子类多次加载
安全:避免伪造java核心类
Android ClassLoader
BootClassLoader
PathClassLoader
源码位置:| /libcore/dalvik/src/main/java/dalvik/system/ |
DexClassLoader
通常网上博客会说PathClassLoader加载apk类,DexClassLoader记载的是自己的dex
我们从源码看一下
6.0源码如下
PathClassLoader源码
public class PathClassLoader extends BaseDexClassLoader {
public PathClassLoader(String dexPath, ClassLoader parent) {
super(dexPath, null, null, parent);
}
public PathClassLoader(String dexPath, String libraryPath,
ClassLoader parent) {
super(dexPath, null, libraryPath, parent);
}
}
DexClassLoader源码
public class DexClassLoader extends BaseDexClassLoader {
public DexClassLoader(String dexPath, String optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(dexPath, new File(optimizedDirectory), libraryPath, parent);
}
}
BaseDexClassLoader源码
public class BaseDexClassLoader extends ClassLoader {
//可以看到optimizedDirectory是传给了DexPathList
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String libraryPath, ClassLoader parent) {
super(parent);
this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
}
}
我们再开看一下8.0 BaseDexClassLoader源码
public class BaseDexClassLoader extends ClassLoader {
public BaseDexClassLoader(String dexPath, File optimizedDirectory,
String librarySearchPath, ClassLoader parent) {
super(parent);
//你会发现optimizedDirectory根本没有使用
this.pathList = new DexPathList(this, dexPath, librarySearchPath, null);
if (reporter != null) {
reporter.report(this.pathList.getDexPaths());
}
}
}
网友评论