posts - 88, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          1. 默認的3個classloader: BootstrapClassloader (Native實現(xiàn)), ExtClassloader, AppClassloader (Java實現(xiàn))
          2. 3個加載器并不是真正的父子繼承關(guān)系,而是邏輯上的,JVM啟動先創(chuàng)建ExtClassloader instance,然后構(gòu)造AppClassloader的時候傳入ExtClassloader實例作為parent
                  Launcher.ExtClassLoader extcl;
                  
          try {
                      extcl 
          = Launcher.ExtClassLoader.getExtClassLoader();
                  } 
          catch (IOException var10) {
                      
          throw new InternalError("Could not create extension class loader", var10);
                  }

                  
          try {
                      
          this.loader = Launcher.AppClassLoader.getAppClassLoader(extcl);
                  } 
          catch (IOException var9) {
                      
          throw new InternalError("Could not create application class loader", var9);
                  }

          關(guān)于雙親委派原理: 在加載類的時候,會看看parent有沒有設(shè)定,如果設(shè)定了 就調(diào)用parent.loadClass方法,如果沒設(shè)定(==null)也就是parent應(yīng)該是BootstrapClassloader, 會調(diào)用native的findBootstrapClass來加載類,代碼:
                          try {
                              
          if(this.parent != null) {
                                  c 
          = this.parent.loadClass(name, false);
                              } 
          else {
                                  c 
          = this.findBootstrapClassOrNull(name);
                              }
                          } 
          catch (ClassNotFoundException var10) {
                              ;
                          }

          目的是按照一定優(yōu)先級別裝載系統(tǒng)的lib,系統(tǒng)ext目錄的lib,以及classpath的lib,防止系統(tǒng)的默認行為或者類的實現(xiàn)被修改。

          3. java 類的動態(tài)加載
          Java內(nèi)置的ClassLoader總會在加載一個Class之前檢查這個Class是否已經(jīng)被加載過,已經(jīng)被加載過的Class不會加載第二次。因此要想重新加載Class,我們需要實現(xiàn)自己的ClassLoader。
          另外一個問題是,每個被加載的Class都需要被鏈接(link),這是通過執(zhí)行ClassLoader.resolve()來實現(xiàn)的,這個方法是 final的,因此無法重寫。Resove()方法不允許一個ClassLoader實例link一個Class兩次,因此,當(dāng)你需要重新加載一個 Class的時候,你需要重新New一個你自己的ClassLoader實例。
          主站蜘蛛池模板: 平凉市| 海安县| 新晃| 农安县| 浙江省| 托克逊县| 旬阳县| 溧水县| 余庆县| 江安县| 盐源县| 达州市| 陆川县| 盐边县| 雷山县| 恩施市| 上林县| 寿光市| 崇仁县| 文水县| 比如县| 依安县| 边坝县| 桃源县| 黄浦区| 莎车县| 宿迁市| 广南县| 东乌珠穆沁旗| 邵武市| 黄大仙区| 新邵县| 黄龙县| 抚顺市| 肥东县| 肇庆市| 信宜市| 阳东县| 九龙县| 英吉沙县| 图木舒克市|