類加載器
- 啟動類加載器 BootstrapClassLoader
- 擴展類加載器 ExtensionClassLoader
- 系統類加載器(應用程序類加載器) AppClassLoader
Java API doc 表述
The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a "parent" class loader. When loading a class, a class loader first "delegates" the search for the class to its parent class loader before attempting to find the class itself.
思考理解
只有當父加載器在自己搜索范圍內找不到特定的類時(即ClassNotFoundException), 子加載器才會嘗試自己去加載
雙親委派中的"雙"并不特指父親母親, 而是泛指父輩, 即父類加載器(是不是叫父類/基類委派更貼切?或者干脆叫啃老委派?)
-
設計緣由:
避免類的重復加載, Java類隨著它的類加載器一起具備了一種帶有優先級的層次關系, 對于已被父加載器加載過的類, 子加載器沒必要重新加載一次
安全性, 最基礎的類一定是由最上層的類加載器實現加載的, 不允許用戶使用自定義加載器在加載基礎類的時候擴展自定義的操作
-
破壞雙親委派模型
SPI(Service Provider Interface) 接口是Java核心庫的一部分, 是由啟動類加載器來加載的, 提供"為某個接口尋找服務實現的機制"
而SPI的實現是由各供應廠商來完成, 實現類是由系統類加載器來加載的, 按雙親委派模型, 啟動類加載器無法委派系統類加載器去加載類
線程上下文類加載器(Context class loader, JDK1.2), Java應用的線程上下文加載器默認就是系統類加載器AppClassLoader, 可通過 Thread 的 setContextClassLoader 方法設置線程的上下文類加載器
案例: JDBC驅動注冊
資料參考
- 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第2版)》
- 深入理解Java類加載器(一):Java類加載原理解析