1. Bootstrap ClassLoader
这个类加载器主要是加载 /jre/lib下面的rt.jar,并且这个类加载器是用C/C++来编写的,并且它是后面Extension ClassLoader的父ClassLoader。
这个类应该在java代码中找不到的(correct me if I am wrong!)。
2. Extension ClassLoader
这个类加载器主要加载JDK的扩展类 /jre/lib/ext,它的实现类是 sun.misc.Launcher$ExtClassLoader :
static class ExtClassLoader extends URLClassLoader {
private static volatile Launcher.ExtClassLoader instance;
public static Launcher.ExtClassLoader getExtClassLoader() throws IOException {
if (instance == null) {
Class var0 = Launcher.ExtClassLoader.class;
synchronized(Launcher.ExtClassLoader.class) {
if (instance == null) {
instance = createExtClassLoader();
}
}
}
return instance;
}
我们看下它的实现,实际上它创建了一个单例模式,使用的是双重检查加锁,小师妹可以考虑一下怎么使用延迟初始化占位类的方式来重新这个类。
3. System ClassLoader
这个加载器是加载定义在ClassLoader中的类。它的实现类是sun.misc.Launcher$AppClassLoader,这个类的实现很长,这里就不完整列出来了:
static class AppClassLoader extends URLClassLoader
在JDK9之后,因为引入了JPMS模块的概念,所以类加载器变得不一样了,在JDK9之后还是有三个内置的类加载器,分别是BootClassLoader,PlatformClassLoader和AppClassLoader:
private static class BootClassLoader extends BuiltinClassLoader {
BootClassLoader(URLClassPath bcp) {
super(null, null, bcp);
}
@Override
protected Class<?> loadClassOrNull(String cn, boolean resolve) {
return JLA.findBootstrapClassOrNull(this, cn);
}
};
private static class PlatformClassLoader extends BuiltinClassLoader
private static class AppClassLoader extends BuiltinClassLoader
Linking阶段主要做了三件事情:
Verification – 主要验证字节码文件的结构的正确性,如果不正确则会报LinkageError。
Preparation – 负责创建static fields,并且初始化他们的值。
Resolution – 把类型的常量池中引用的类,接口,字段和方法替换为直接引用的过程。
Initialization阶段主要是调用class的父类和自身的初始化方法,来设置变量的初始值。