通俗易懂的双亲委派机制
當你超過別人一點點,別人會嫉妒你;當你超過別人一大截,別人就會羨慕你
據說給我點關注的都成了大佬,點關注的我都會私發一份好東西???????
嘔心瀝血半年之作,進去不點贊你回來罵我https://blog.csdn.net/codeyanbao/article/details/111569150???????
你得先知道
在介紹雙親委派機制的時候,不得不提ClassLoader(類加載器)。說ClassLoader之前,我們得先了解下Java的基本知識。
Java是運行在Java的虛擬機(JVM)中的,但是它是如何運行在JVM中了呢?我們在IDE中編寫的Java源代碼被編譯器編譯成.class的字節碼文件。然后由我們得ClassLoader負責將這些class文件給加載到JVM中去執行。
JVM中提供了三層的ClassLoader:
-
Bootstrap classLoader:主要負責加載核心的類庫(java.lang.*等),構造ExtClassLoader和APPClassLoader。
-
ExtClassLoader:主要負責加載jre/lib/ext目錄下的一些擴展的jar。
-
AppClassLoader:主要負責加載應用程序的主函數類
那如果有一個我們寫的Hello.java編譯成的Hello.class文件,它是如何被加載到JVM中的呢?別著急,請繼續往下看。
雙親委派機制
我打開了我的AndroidStudio,搜索了下“ClassLoader”,然后打開“java.lang”包下的ClassLoader類。然后將代碼翻到loadClass方法:
publicClass<?>loadClass(Stringname)throwsClassNotFoundException{
returnloadClass(name,false);
}
//-----??-----
protectedClass<?>loadClass(Stringname,booleanresolve)
throwsClassNotFoundException
{
//首先,檢查是否已經被類加載器加載過
Class<?>c=findLoadedClass(name);
if(c==null){
try{
// 存在父加載器,遞歸的交由父加載器
if(parent!=null){
c=parent.loadClass(name,false);
}else{
// 直到最上面的Bootstrap類加載器
c=findBootstrapClassOrNull(name);
}
}catch(ClassNotFoundExceptione){
//ClassNotFoundExceptionthrownifclassnotfound
//fromthenon-nullparentclassloader
}
if(c==null){
//Ifstillnotfound,theninvokefindClassinorder
//tofindtheclass.
c=findClass(name);
}
}
returnc;
}
其實這段代碼已經很好的解釋了雙親委派機制,為了大家更容易理解,我做了一張圖來描述一下上面這段代碼的流程:
從上圖中我們就更容易理解了,當一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那么會拿到父加載器,然后調用父加載器的loadClass方法。父類中同理也會先檢查自己是否已經加載過,如果沒有再往上。注意這個類似遞歸的過程,直到到達Bootstrap classLoader之前,都是在檢查是否加載過,并不會選擇自己去加載。直到BootstrapClassLoader,已經沒有父加載器了,這時候開始考慮自己是否能加載了,如果自己無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException。那么有人就有下面這種疑問了?
為什么要設計這種機制
這種設計有個好處是,如果有人想替換系統級別的類:String.java。篡改它的實現,在這種機制下這些系統的類已經被Bootstrap classLoader加載過了(為什么?因為當一個類需要加載的時候,最先去嘗試加載的就是BootstrapClassLoader),所以其他類加載器并沒有機會再去加載,從一定程度上防止了危險代碼的植入。
總結了一張腦圖如下:
參加CSDN 1024當天比賽文章,學Java的看完不點贊你再來打我
想成為Java開發專家,了解這些還遠遠不夠,我這里總結了一些Java知識的史上最全腦圖:
等等等還有五十幾張腦圖等著你,不光是腦圖,知識點的講解也會在下面的公眾號第一時間發布哦,趕緊來關注吧~
微信搜索:IT爛筆頭 或者微信掃描二維碼,關注回復【職場】獲得作者好友位
總結
以上是生活随笔為你收集整理的通俗易懂的双亲委派机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Spartacus UI 服务器
- 下一篇: jaxen.jar下载地址