Java類加載器學習總結

1、爲何要有類加載器

Java不像一些靜態編譯型的語言,是在編譯期間就進行鏈接的,而是在運行期間加載類的。這也爲Java提供了極大的靈活性java

2、什麼是類加載

1. 類的生命週期

共7步:  加載-->(驗證-->準備-->解析)-->初始化-->使用-->卸載數組

其中(驗證-->準備-->解析) 又稱爲 鏈接.jvm

加載初始化 就是類的加載.spa

2. 類加載的時機

只有對類進行主動引用時纔會加載, 而被動引用則不會加載.線程

1) 主動引用

new對象, 訪問靜態變量, 調用靜態方法對象

反射繼承

主類生命週期

初始化子類時, 會先初始化父類io

對於>JDK1.7, 遇到MethodHandle 時,也會初始化編譯

2) 被動引用

常量: 常量在常連池中, 已經和類基本不要緊了

數組的定義

經過子類訪問父類的靜態字段

3、類加載器的分類

按照優先級關係以下:

1. Bootstrap   引導(啓動)類加載器    jvm的一部分       JAVA_HOME/lib

2. Extension   擴展類加載器  java   JAVA_HOME/lib/ext

3. Application  系統類加載器  java   classpath

4. 自定義類加載器  java

當加載一個類時, 會先委託給父類進行加載, 當父類加載不了時, 纔會由子類進行加載. 這就是雙親委派模型.

若是要自定義加載器, 繼承ClassLoader, 並重寫findClass 方法便可.

 

4、破壞雙親委派模型

因爲雙親委派模型的限制, 越是基礎的類庫,就不能加載上層的類了. 例如 JNDI.

因而就引入了線程上下文類加載器.

相關文章
相關標籤/搜索