类加载器加载顺序
- Bootstrap ClassLoader
- ExtClassLoader
- AppClassLoader
为啥加载顺序是这样的?从Launcher类说起
Launcher类
分析Launcher构造器源码
public Launcher() {
Launcher.ExtClassLoader var1;
try {
var1 = Launcher.ExtClassLoader.getExtClassLoader();
} catch (IOException var10) {
throw new InternalError("Could not create extension class loader", var10);
}
try {
//AppClassLoader 父加载器 ExtClassLoader
this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
} catch (IOException var9) {
throw new InternalError("Could not create application class loader", var9);
}
Thread.currentThread().setContextClassLoader(this.loader);
.......
}
Launcher类中封装了ExtClassLoader和AppClassLoader
分析ExtClassLoader和AppClassLoader源码
static class ExtClassLoader extends URLClassLoader {
public ExtClassLoader(File[] var1) throws IOException {
// ExtClassLoader 父加载器 null
super(getExtURLs(var1), (ClassLoader)null, Launcher.factory);
......
}
}
static class AppClassLoader extends URLC