基本概念:
Java Classloader(類裝載器):JRE的一個模塊,用於裝載Java類到JVM。
JRE加載一個類到JVM需要以下基本步驟:
裝載:查找並導入class文件,如String.class;
鏈接:校驗、准備、解析,其中解析步驟是可以選擇的,由使用目的決定;
校驗:檢查載入class文件數據的正確性,因為某些class文件可能是利用工具生成,而非使用Java編譯器編譯生成;
准備:給類的靜態成員分配存儲空間;
解析:將符號引用轉成直接引用;
初始化:對類的靜態成員、靜態代碼塊執行初始化工作。
JRE自帶的的三個ClassLoader:
Bootstrap class loader:用於裝載<JAVA_HOME>/jre/lib目錄下的Java核心類庫,該裝載器使用本地代碼實現,本身不是Java類。
Extensions class loader:用於裝載<JAVA_HOME>/jre/lib/ext目錄下的類庫,或者java.ext.dirs系統屬性指定的目錄,具體實現類是sun.misc.Launcher$ExtClassLoader。
System class loader:用於裝載應用CLASSPATH路徑指定的類與資源(如配置文件等),具體實現類是sun.misc.Launcher$AppClassLoader,所以也常稱為App class loader。
為什麼需要三個class loader?這三個class loader又是如何分工了?這年代靠拼爹,需要任何東西盡管先向爹要,爹沒有再自己拼,下圖中100萬比喻為請求的類,天一為System class loader,天一爸爸為Extensions class loader,天一爺爺為BootStrap class loader,查看保險箱相當於load class,通過這個形象的比喻可以簡單的理解class loader代理關系,以及單一職責鏈模式。JRE提供三個class loader主要是為了分工以及JVM實現的需要。