JVM原始碼分析--ClassLoader類載入器
阿新 • • 發佈:2019-01-05
本人原創,轉載請註明出處:https://www.cnblogs.com/javallh/p/10224187.html
1、JDK已有類載入器:
BootStrap ClassLoader (啟動類載入器) 執行的是rt.jar 原始碼由C++編寫,所以在java中讀取的時候以null表示
Extension ClassLoader extends ClassLoader 執行的是%JAVA_HOME%/lib/ext/*.jar
App ClassLoader extends ClassLoader 執行的是ClassPath
2、自定義類載入器 extends ClassLoader
預設的載入順序:自定義類載入器--App ClassLoader--Extension ClassLoader--BootStrap ClassLoader (遵循雙親委派模型,並無繼承關係!下面可以看原始碼)
程式體現:
package com.cloud.rest; import lombok.var; import org.junit.Test; public class ClassLoaderTest { @Test public voidclassLoderTest() { var loader = ClassLoaderTest.class.getClassLoader(); while (loader != null) { System.out.println(loader); loader = loader.getParent(); } System.out.println(loader); } }
如下效果分析:
[email protected] sun.m[email protected]null
載入機制可以體現,為null的輸出是因為載入BootStrap ClassLoader的時候由於BootStrap無法讀取,所以使用null來表示,也可以這樣說:如果某個類的父類載入器輸出為null,則表示它的父類載入器為BootStrap ClassLoader,(注意:此時的父類為雙親委派模型的概念,並不是類的繼承)