要了解雙親委派機制得先了解個概念:
類加載器:“通過一個類的全限定名來獲取描述此類的二進制字節流”這個動作放到java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊成為“類加載器”。
通俗的講,虛擬機是根據類的全限定名來加載類的,那么有個問題,如果同時存在兩個或多個全限定名完全一致的情況下。該如何選擇加載哪個類。這就是雙親委派機制要做的工作。
在這里強加個知識點:比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有真正的意義,否則,即使這兩個類來源於同一個class文件,被同一個虛擬機加載,只要加載他們的類加載器不同,那這兩個類就必定不相等。
回到雙親委派的問題上,接下來了解下類加載器的種類:
1-啟動類加載器,負責加載%JAVA_HOME%\bin目錄下的所有jar包,或者是-Xbootclasspath參數指定的路徑;
2-擴展類加載器:負責加載%JAVA_HOME%\bin\ext目錄下的所有jar包,或者是java.ext.dirs參數指定的路徑;
3-應用程序類加載器:負責加載用戶類路徑上所指定的類庫,如果應用程序中沒有自定義加載器,那么次加載器就為默認加載器。
加載器之間的層次關系:

雙親委派機制得工作過程:
1-類加載器收到類加載的請求;
2-把這個請求委托給父加載器去完成,一直向上委托,直到啟動類加載器;
3-啟動器加載器檢查能不能加載(使用findClass()方法),能就加載(結束);否則,拋出異常,通知子加載器進行加載。
4-重復步驟三;
以上就是雙親委派機制的原理。
接下來舉個例子:
大家所熟知的Object類,直接告訴大家,Object默認情況下是啟動類加載器進行加載的。假設我也自定義一個Object,並且制定加載器為自定義加載器。現在你會發現自定義的Object可以正常編譯,但是永遠無法被加載運行。
這是因為申請自定義Object加載時,總是啟動類加載器,而不是自定義加載器,也不會是其他的加載器。
人和事物都有缺陷,雙親委派機制也不例外,三次得到破壞:
1-jdk1.2之間,用戶直接去調用loadClass()方法;不能保證雙親委派機制的基本規則。后改成findClass()方法。
2-雙親委派機制的自我缺陷,使用了線程上下文類加載器。這種行為打破了雙親委派機制模型的層次關系來逆向使用類加載器,實際上違背了雙親委派機制的一般性原則。
3-用戶對程序動態性的追求而導致的。例如鼠標,鍵盤燈熱部署。
參考文獻:深入JVM虛擬機 周志明