1、Java類加載的過程Java類的加載過程是動態(tài)的,它不會一次性把程序所有的類全部加載后再運(yùn)行,而是先保障程序運(yùn)行的基礎(chǔ)類加載到JVM虛擬機(jī)當(dāng)中,其他的類,一般是再需要的時候才會去加載,這樣的運(yùn)行機(jī)制也達(dá)到了節(jié)約內(nèi)存的目的。當(dāng)JVM虛擬機(jī)加載某個class文件的時候,采用的是雙親委派模式(任務(wù)委派模式),就是將請求交給父類去處理。2、類裝載的方式隱式裝載:程序在運(yùn)行過程中當(dāng)碰到通過new 等方式生成對象時,隱式調(diào)用類裝載器加載對應(yīng)的類到JVM中。顯式裝載:通過class.forName()等方法,顯式加載需要的類3、雙親委派機(jī)制的概念雙親委派機(jī)制是指當(dāng)一個類加載器收到某個類加載請求時,該類加載器首先會把請求委派給父類加載器。每個類加載器都是如此,它會先委托父類加載器在自己的搜索范圍內(nèi)找不到對應(yīng)的類時,該類加載器才會嘗試自己去加載。4、雙親委派模式的工作流程Application ClassLoader 收到一個類加載請求時,首先它自己不會先去嘗試加載這個類,而是先將這個加載請求委派給父類加載器Extension ClassLoader去加載。 如果Extension ClassLoader收到一個類加載請求時,先將加載請求委派給父類加載器Bootstrap ClassLoader去完成。 如果Bootstrap ClassLoader加載失敗(在<JAVA_HOME>\lib中未找到所需類),就會讓Extension ClassLoader嘗試加載,如果加載成功了就不再讓Extension ClassLoader加載,過程結(jié)束。 如果Extension ClassLoader也加載失敗,就會使用Application ClassLoader加載如果加載成功了就不再讓Application ClassLoader加載,過程結(jié)束。 如果Application ClassLoader也加載失敗,就會使用自定義加載器去嘗試加載。 如果所有的加載都失敗了,就會拋出ClassNotFoundException異常。理解:執(zhí)行的情況都是由Bootstrap ClassLoader先加載,失敗了輪到Extension ClassLoader加載,再失敗了輪到Application ClassLoader,最后輪到自定義加載器加載。一般情況下大家寫的java程序都是Application ClassLoader進(jìn)行加載的。5、雙親委派模型的核心代碼protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 首先,檢查這類是否已經(jīng)被加載過了 Class<?> c = findLoadedClass(name); if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { //如果存在父類加載器,則取找該類的父類加載器 c = parent.loadClass(name, false); } else { //返回由引導(dǎo)類加載器加載的類;如果未找到,則返回 null。 c = findBootstrapClassOrNull(name); } } catch (ClassNotFoundException e) { // 如果父類加載器拋出ClassNotFoundException異常 // 則說明父類加載器無法完成加載請求 }
if (c == null) { // 在父類加載器無法加載時 // 再調(diào)用本身的findClass方法來進(jìn)行加載 long t1 = System.nanoTime(); c = findClass(name);
// 這是定義類加載器;記錄統(tǒng)計(jì)數(shù)據(jù) sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); sun.misc.PerfCounter.getFindClasses().increment(); } } if (resolve) { resolveClass(c); } return c; } }
6、雙親委派機(jī)制的作用防止加載同一個class文件。通過委托的方式去詢問父級是否已經(jīng)加載過該class,如果加載過了就不需要重新加載。從而保證了數(shù)據(jù)安全。通過委托的方式,保證Java核心class不被篡改,即使被篡改也不會被加載,即使被加載也不會是同一個class對象,因?yàn)椴煌募虞d器加載同一個.class也不是同一個Class對象。這樣則保證了Class的執(zhí)行安全。IT技術(shù)分享社區(qū) 個人博客網(wǎng)站:https://
|