類加載過程爲JVM將類描述數據從.class文件中加載到內存,並對數據進行解析和初始化,最終造成被JVM直接使用的Java類型。包含:java
類加載過程當中的加載操做由類加載去完成。類加載器分爲:segmentfault
雙親委派過程:當一個類加載器收到類加載任務時,當即將任務委派給它的父類加載器去執行,直至委派給最頂層的啓動類加載器爲止。若是父類加載器沒法加載委派給它的類時,將類加載任務退回給它的下一級加載器去執行。數據結構
雙親委派模型最大的好處就是讓Java類同其類加載器一塊兒具有了一種帶優先級的層次關係。舉個例子來講明下:好比咱們要加載頂層的Java類——java.lang.Object類,不管咱們用哪一個類加載器去加載Object類,這個加載請求最終都會委託給啓動類加載器(Bootstrap ClassLoader),這樣就保證了全部加載器加載的Object類都是同一個類。若是沒有雙親委派模型,就會出現 Wupx::Object 和 Huyx::Object 這樣兩個不一樣的Object類。this
java.lang.ClassLoader 的 loadClass() 方法spa
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // First, check if the class has already been loaded Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass(name); // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }