實現通過類的全限定名獲取該類的二進制字節流的代碼塊叫做類加載器。
一、啟動類加載器(Bootstrap Class Loader)
這個類加載器負責加載存放在<JAVA_HOME>\lib目錄,或者被-Xbootclasspath參數所指定的路徑中存放的,而且是Java虛擬機能夠識別的(按照文件名識別,如rt.jar、tools.jar,名字不符合的類庫即使放在lib目錄中也不會被加載)類庫加載到虛擬機的內存中。啟動類加載器無法被Java程序直接引用,用戶在編寫自定義類加載器時,如果需要把加載請求委派給引導類加載器去處理,那直接使用null代替即可。
二、擴展類加載器(Extension Class Loader)
這個類加載器是在類sun.misc.Launcher$ExtClassLoader 中以Java代碼的形式實現的。它負責加載<JAVA_HOME>\lib\ext目錄中,或者被java.ext.dirs系統變量所指定的路徑中所有的類庫。根據擴展類加載器這個名稱,就可以推斷出這是一種Java系統類庫的擴展機制,JDK的開發團隊允許用戶將具有通用性的類庫放置在ext目錄里以擴展Java SE的功能,在JDK9之后,這種擴展機制被模塊化帶來的天然的擴展能力所取代。由于擴展類加載器是由Java代碼實現的,開發者可以直接在程序中使用擴展類加載器來加載Class文件。
三、應用程序類加載器(Application Class Loader)
這個類加載器由sun.misc.Launcher$AppClassLoader來實現。由于應用程序類加載器是ClassLoader類中的getSystem-ClassLoader()方法的返回值,所以有些場合中也稱它為“系統類加載器”。它負責加載用戶類路徑
(ClassPath)上所有的類庫,開發者同樣可以直接在代碼中使用這個類加載器。如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載器。
四、自定義類加載器
- 想加載非 classpath 隨意路徑中的類文件
- 通過接口來使用實現,希望解耦時,常用在框架設計
- 這些類希望予以隔離,不同應用的同名類都可以加載,不沖突,常見于 tomcat 容器
- 繼承ClassLoader父類