類加載器筆記

類加載器


1. 什麼是類加載器
  * 把.class文件加載到JVM的方法區中,變成一個Class對象!


2. 得到類加載器
  * Class#getClassLoader()


3. 類加載器的分類
  它們都是片警!
  * 引導:類庫!
  * 擴展:擴展jar包
  * 系統:應用下的class,包含開發人員寫的類,和第三方的jar包!classpath下的類!


  系統類加載器的上層領導:擴展
  擴展類加載器的上層領導:引導
  引導沒上層,它是BOSS


  ======================================


4. 類加載器的委託機制
  * 代碼中出現了這麼一行:new A();
    > 系統發現了自己加載的類,其中包含了new A(),這說明需要系統去加載A類
    > 系統會給自己的領導打電話:讓擴展去自己的地盤去加載A類
    > 擴展會給自己的領導打電話:讓引導去自己的地盤去加載A類
    > 引導自己真的去rt.jar中尋找A類
      * 如果找到了,那麼加載之,然後返回A對應的Class對象給擴展,擴展也會它這個Class返回給系統,結束了!
      * 如果沒找到:
        > 引導給擴展返回了一個null,擴展會自己去自己的地盤,去尋找A類
  * 如果找到了,那麼加載之,然後返回A對應的Class對象給系統,結束了!
  * 如果沒找到
    > 擴展返回一個null給系統了,系統去自己的地盤(應用程序下)加載A類
      * 如果找到了,那麼加載之,然後返回這個Class,結束了!
      * 如果沒找到,拋出異常ClassNotFoundException




5. 類的解析過程


class MyApp {//被系統加載


main() {
  A a = new A();//也由系統加載
  String s = new String();//也由系統加載!
}


}


class String {//引導
  private Integer i;//直接引導加載
}


=====================


6.自定義類加載器


* 繼承ClassLoader
* 重寫findClass()


=====================


7. Tomcat的類加載器
  Tomcat提供了兩種類加載器!
  * 服務器類加載器:${CATALINA_HOME}\lib,服務器類加載器,它負責加載這個下面的類!
  * 應用類加載器:${CONTEXT_HOME}\WEB-INF\lib、${CONTEXT_HOME}\WEB-INF\classes,應用類加載器,它負責加載這兩個路徑下的類!


  引導
  擴展
  系統


  特性:
  服務器類加載器:先自己動手,然後再去委託
  應用類加載器::先自己動手,然後再去委託
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章