日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java高级篇——深入浅出Java类加载机制

發布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java高级篇——深入浅出Java类加载机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自?Java高級篇——深入淺出Java類加載機制

類加載器


簡單講,類加載器ClassLoader的功能就是負責將class文件加載到jvm內存。


類加載器分類


從虛擬機層面講分為兩大類型的類加載器,一是Bootstrap Classloader即啟動類加載器(C++實現),它是虛擬機的一部分,二是其他類型類加載器(JAVA實現),在虛擬機外部,并全部繼承ClassLoader類。


從細分的角度講會分為以下三類類加載器:


1、Bootsrap ClassLoader


啟動類加載器,完全由jvm控制加載,外面訪問不到這個類加載器,即不能被java程序引用。它主要負責加載jvm自身的工作類,即java/lib目錄和-Xbootclasspath參數指定的目錄的類庫。


2、Extension ClassLoader


擴展類加載器,由java實現,即ExtClassLoader實現類。它主要負責加載java/lib/ext目錄和系統環境變量java.ext.dirs指定目錄所有類庫。


3、Application ClassLoader


應用程序類加載器,由java實現,即AppClassLoader實現類。它的父類是ExtClassLoader,它主要負責加載classpath目錄上的類庫。如果沒有自定義ClassLoader,它就是程序中默認的ClassLoader,即可以通過ClassLoader.getSystemClassLoader()獲取當前系統的類加載器。



從上圖看雖然Bootstrap ClassLoader是最頂層的類加載器,但是不能被程序引用,它也不是ExtClassLoader的父類加載器,ExtClassLoader沒有父類載器,我們不防來看下面簡單的例子。


程序首先輸出了程序默認的類加載器AppClassLoader,然后再輸出了其父類加載器ExtClassLoader,然后就完了,這就證實了上面的理論。


類加載機制


雖然定義了上面這幾個類加載器,但在加載時類加載器會審查一個class類應該由哪個類型的加載器負責加載,它使用的是等級加載機制,是一種雙親委派模型。


雙親委派模式要求所有類加載器,除了頂層的Bootstrap類加載器之外都要有自己的父類加載器。在收到一個類加載請求時,當前默認的類加載器它不會首先自己來加載這個類,它會委托給自己的父類加載器去加載,父類加載器再委托給父父類加載器,以此類推,直到頂層類加載器,由上到下加載,除非上面的類加載器都無法加載時自己才去加載。


來看看ClassLoader.loadClass方法源碼



再回到之前文章中的有一道關于是否可以自定義類java.lang.String并使用的面試題,它在java/lib目錄下,所以當應用類加載器去classpath加載時會去委托父類加載器,這時最頂層類加載器會發現自己之前已經加載過,所以這次不再加載,所以自定義的這個java.lang.String雖然可以正常編譯,但不能被類加載器加載并使用。


所以,這也是雙親委派模式的好處,同一個路徑的類保證不能加載兩次,保證了類與類之間的正常行為和正常運行。



總結

以上是生活随笔為你收集整理的Java高级篇——深入浅出Java类加载机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。