<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 雙親委派模型 **雙親委派模型\(Parents Delegation Model\):** * 定義:當一個類加載器接收到一個類的加載任務時,它并不會立即展開加載,而是將加載器任務委派給它的超類加載器去執行,每一層的類加載器都采用相同的方式,直至委派給最頂層的啟動類加載器為止;如果超類加載器無法加載委派給它的類時,將加載任務退回給它的下一級類加載器去執行加載; * 按照雙親委派模型的規則,除了啟動類加載器之外,所有的類加載器都擁有一個超類加載器 ![](https://img.kancloud.cn/10/1b/101bb523bf9eb67bba273f601a1c3f8c_1366x746.png) #### 優點 * 能夠有效確保一個類的全局唯一性\(同一個類只會被加載一次\) #### java.lang.ClassNotFoundException 顯示調用下面兩種方式可能會導致類加載異常: * Class.forName\(\) * ClassLoader.getSystemClassLoader\(\).loadClass\(\) #### 知識點 * JAVA虛擬機規范并沒有要求類加載器的加載機制一定要使用雙親委派模型,只是建議采用這種方式 * 比如Tomcat就是自行實現了類加載機制\(當默認的類加載器接收到一個類的加載任務時先自行加載,當加載失敗時才會委派給它的超類加載器執行加載,這同時也是Servlet規范推薦的一種做法\) * 程序中如果沒有顯示指定類加載器,AppClassLoader就是任務委派的發起者 #### 彩圖![](https://img.kancloud.cn/e0/b9/e0b977c5a3cb556df6a148c3bf29f6ee_1001x758.jpg) ### 為什么要使用雙親委托這種模型呢? 因為這樣可以避免重復加載,當父親已經加載了該類的時候,就沒有必要子ClassLoader再加載一次。考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時使用自定義的String來動態替代java核心api中定義的類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因為String已經在啟動時就被引導類加載器(Bootstrcp ClassLoader)加載,所以用戶自定義的ClassLoader永遠也無法加載一個自己寫的String,除非你改變JDK中ClassLoader搜索類的默認算法。 ### 但是JVM在搜索類的時候,又是如何判定兩個class是相同的呢? JVM在判定兩個class是否相同時,不僅要判斷兩個類名是否相同,而且要判斷是否由同一個類加載器實例加載的。只有兩者同時滿足的情況下,JVM才認為這兩個class是相同的。就算兩個class是同一份class字節碼,如果被兩個不同的ClassLoader實例所加載,JVM也會認為它們是兩個不同class #### 既然JVM已經提供了默認的類加載器,為什么還要定義自已的類加載器呢? 因為Java中提供的默認ClassLoader,只加載指定目錄下的jar和class,如果我們想加載其它位置的類或jar時,比如:我要加載網絡上的一個class文件,通過動態加載到內存之后,要調用這個類中的方法實現我的業務邏輯。在這樣的情況下,默認的ClassLoader就不能滿足我們的需求了,所以需要定義自己的ClassLoader
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看