amba simple class驱动_学习笔记:class加载器和双亲委派模型
類加載器
類加載器有四種
- 啟動類加載器(Bootstrap ClassLoader)
負責加載 JAVA_HOMElib ?錄中的,或通過-Xbootclasspath參數指定路徑中的且被虛擬機認可(按?件名識別,如rt.jar)的類。這個加載器由C++實現的,并不是java實現的
- 擴展類加載器(Extension ClassLoader)
負責加載 JAVA_HOMElibext ?錄中的,或通過java.ext.dirs系統變量指定路徑中的類庫。
- 應?程序類加載器(Application ClassLoader)
負責加載?戶路徑(classpath)上的類庫
- 自定義加載器(User ClassLoader)
JVM?帶的三個加載器只能加載指定路徑下的類字節碼,如果某個情況下,我們需要加載應?程序之外的類?件呢??如本地D盤下的,或者去加載?絡上的某個類?件,這種情況就可以使??定義加載器了。
自定義加載器的步驟,(1)繼承ClassLoader ——>(2)重寫findClass()?法 ——>(3)調?defineClass()?法
加載器
JVM的類加載器是通過ClassLoader及其?類來完成的,類的層次關系和加載順序可以由下圖來描述
加載過程中會先檢查類是否被已加載,檢查順序是?底向上,從Custom ClassLoader到BootStrapClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載?次。?加載的順序是?頂向下,也就是由上層來逐層嘗試加載此類。
雙親委派模型
JVM通過雙親委派模型進?類的加載,當?個類加載器收到類加載任務,會先交給其?類加載器去完成,因此最終加載任務都會傳遞到頂層的啟動類加載器,只有當?類加載器?法完成加載任務時,才會嘗試執?加載任務。
這樣可以避免重復加載,當?親已經加載了該類的時候,就沒有必要?ClassLoader再加載?次。
我們可以想一下,若是不這么做,那我們就可以隨時使??定義的String來動態替代java核?api中定義的類型,這樣會存在?常?的安全隱患,?雙親委托的?式,就可以避免這種情況,因為String已經在啟動時就被引導類加載器(Bootstrcp ClassLoader)加載,所以?戶?定義的ClassLoader永遠也?法加載?個??寫的String,除?你改變JDK中ClassLoader搜索類的默認算法。
破壞雙親委派模型
在某些情況下?類加載器需要加載的class?件由于受到加載范圍的限制,?類加載器?法加載到需要的?件,這個時候就需要委托?類加載器進?加載。
但是按照雙親委派模式,?類需要委托?類加載器去加載class?件。無疑是沒法達到我們的目的地。這個時候就需要破壞雙親委派模式才能加載成功?類加載器需要的類。就需要?類會委托?類去加載它需要的class?件。
比如 jdk 中定義的 Driver 接?,但它的實現由在各大數據庫的服務商來提供,像mysql的就寫了MySQL Connector ,這些實現類都是以jar包的形式放到classpath?錄下。
so,問題就來了,DriverManager(也由jdk提供)要加載各個實現了Driver接?的實現類(classpath下),然后進?管理,但是DriverManager由啟動類加載器加載,只能加載JAVA_HOME的lib下?件,?其實現是由服務商提供的,在classpath目錄下,由系統類加載器加載,這個時候就需要啟動類加載器來委托?類來加載Driver實現,從?破壞了雙親委派。這?僅僅是舉了破壞雙親委派的其中?個情況。
大家還有其他破壞雙親委派模型的例子不,可以留言分享一下。
個人學習整理,有錯歡迎糾正
總結
以上是生活随笔為你收集整理的amba simple class驱动_学习笔记:class加载器和双亲委派模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openvino与cv2不兼容怎么办_焓
- 下一篇: ace unlock 苹果解锁_Appl