<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 類裝載過程 ![](https://box.kancloud.cn/159f59aea9a536c5802e5f2d79487850_853x351.png) 裝載:通過累的全限定名獲取二進制字節流,將二進制字節流轉換成方法區中的運行時數據結構,在內存中生成Java.lang.class對象; 鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;   校驗:檢查導入類或接口的二進制數據的正確性;(文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證)   準備:給類的靜態變量分配并初始化存儲空間;   解析:將常量池中的符號引用轉成直接引用; 初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊,并初始化程序員設置的變量值。 # 簡介 Java在需要使用類的時候,才會將類加載,Java的類加載是由類加載器來完成的。當在命令行模式下執行java XXX.class指令后,java運行程序會嘗試找到JRE安裝的所在目錄,然后尋找jvm.dll(默認是在JRE目錄下bin\client目錄中),接著啟動JVM并進行初始化動作,產生Bootstrap Loader,Bootstrap Loader會加載Extended Loader,并設定Extende Loader的parent為Bootstrap Loader。接著Bootstrap Loader會加載System Loader,并將System Loader的parent設定為Extended Loader。 Bootstrap Loader通常由C編寫而成,Extended Loader是由Java編寫而成,實際是對應于sun.misc.Launcher$ExtClassLoader(Launcher中的內部類).System Loader是由java編寫而成,實際對你關于 sun.misc.Launcher$AppClassLoader(Launcher中的內部類)。 Bootstrap Loader會搜索系統參數sun.boot.class.path中指定位置的類,默認是JRE所在目錄的classes下的.class文件,或lib目錄下.jar文件中(如tr.jar)的類并加載。可用System.getProperty(“sun.boot.class.path”)來顯示sun.boot.class.path中指定的路徑。 Extended Loader是由Java編寫而成,會搜索系統參數java.ext.dirs中指定位置的類,默認是JRE目錄下的lib\ext\classes目錄下的.class文件,或lib\ext目錄下的.jar文件中的類并加載。 System Loader是由java編寫而成,會搜索系統參數java.class.path中指定位置的類,也就是Classpath所指定的路徑,默認是當前工作路徑下的.class文件。 在加載類時,每個類加載器會先將加載類的任務交給其parent,如果parent找不到,再由自己負責加載。所以在加載類順序為:Bootstrap Loader——》Extended Loader——》System Loader的順序來尋找類,若都找不到,會拋出NoClassDefFoundError. 類加載器在Java中是以java.lang.ClassLoader類型存在,每一個類被加載后,都會有一個Class的實例來代表,而每個Class的實例都會記得自己是由哪個ClassLoader加載的。可以由Class的getClassLoader()取得加載該類的ClassLoader,而從ClassLoader的getParent()方法可以取得自己的parent # 分析 Class.forName()和ClassLoader.loadClass ~~~ Class.forName(className)方法,內部實際調用的方法是 Class.forName(className,true,classloader); 第2個boolean參數表示類是否需要初始化, Class.forName(className)默認是需要初始化。 一旦初始化,就會觸發目標對象的 static塊代碼執行,static參數也也會被再次初始化。 ClassLoader.loadClass(className)方法,內部實際調用的方法是 ClassLoader.loadClass(className,false); 第2個 boolean參數,表示目標對象是否進行鏈接,false表示不進行鏈接,由上面介紹可以, 不進行鏈接意味著不進行包括初始化等一些列步驟,那么靜態塊和靜態對象就不會得到執行 ~~~ # 數據庫鏈接為什么使用Class.forName(className) JDBC Driver源碼如下,因此使用Class.forName(classname)才能在反射回去類的時候執行static塊 ~~~ static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } ~~~
                  <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>

                              哎呀哎呀视频在线观看