1. Bootstrap ClassLoader
這個類加載器主要是加載 /jre/lib下面的rt.jar,并且這個類加載器是用C/C++來編寫的,并且它是后面Extension ClassLoader的父ClassLoader。
這個類應(yīng)該在java代碼中找不到的(correct me if I am wrong!)。
2. Extension ClassLoader
這個類加載器主要加載JDK的擴(kuò)展類 /jre/lib/ext,它的實現(xiàn)類是 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;
}
我們看下它的實現(xiàn),實際上它創(chuàng)建了一個單例模式,使用的是雙重檢查加鎖,小師妹可以考慮一下怎么使用延遲初始化占位類的方式來重新這個類。
3. System ClassLoader
這個加載器是加載定義在ClassLoader中的類。它的實現(xiàn)類是sun.misc.Launcher$AppClassLoader,這個類的實現(xiàn)很長,這里就不完整列出來了:
static class AppClassLoader extends URLClassLoader
在JDK9之后,因為引入了JPMS模塊的概念,所以類加載器變得不一樣了,在JDK9之后還是有三個內(nèi)置的類加載器,分別是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 – 主要驗證字節(jié)碼文件的結(jié)構(gòu)的正確性,如果不正確則會報LinkageError。
Preparation – 負(fù)責(zé)創(chuàng)建static fields,并且初始化他們的值。
Resolution – 把類型的常量池中引用的類,接口,字段和方法替換為直接引用的過程。
Initialization階段主要是調(diào)用class的父類和自身的初始化方法,來設(shè)置變量的初始值。