基於Java類別的載入方式之classloader類別載入器詳解
下面小編就為大家帶來一篇classloader類別載入器_基於java類別的載入方式詳解。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
基礎概念
#Classloader 類別載入器,用來載入 Java 類別到 Java 虛擬機器中。與普通程序不同的是。 Java程式(class檔案)並不是本地的執行程式。當執行Java程式時,先執行JVM(Java虛擬機),然後再把Java class載入到JVM裡頭運行,負責載入Java class的這部分就叫做Class Loader。
JVM本身包含了一個ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地程式碼實現的,它負責載入核心JavaClass(即所有java.*開頭的類別)。另外JVM還會提供兩個ClassLoader,它們都是用Java語言寫的,由BootstrapClassLoader載入;其中Extension ClassLoader負責載入擴充的Javaclass(例如所有javax.*開頭的類別和存放在JRE的ext目錄下的類別) ,ApplicationClassLoader負責載入應用程式本身的類別。
當執行一個程式的時候,JVM啟動,執行bootstrapclassloader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後呼叫ExtClassLoader載入擴充API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個程式最基本的載入流程。
註: 學ClassLoader看OSGI程式應用
什麼時候JVM會使用ClassLoader載入一個類別呢?當你使用java去執行一個類,JVM使用ApplicationClassLoader載入這個類別;然後如果類A引用了類別B,不管是直接引用還是用Class.forName()引用,JVM就會找到載入類別A的ClassLoader,並用這個ClassLoader來載入類別B。 JVM依照運行時的有效執行語句,來決定是否需要裝載新類,從而裝載盡可能少的類,這一點和編譯類是不相同的。
Why use your own ClassLoader?
#似乎JVM自身的ClassLoader已經夠了,為什麼我們還要創造自己的ClassLoader呢?
因為JVM自帶的ClassLoader只是懂得從本機檔案系統載入標準的java class文件,如果寫自己的ClassLoader,你可以做到:
1)在執行非置信程式碼之前,自動驗證數位簽章
2)動態地建立符合使用者特定需求的客製化建置類別
#3)從特定的場所取得java class,例如資料庫中
4) 等等
事實上當使用Applet的時候,就用到了特定的ClassLoader,因為這時需要從網路上載入java class,並且要檢查相關的安全資訊。
應用程式伺服器大都使用了ClassLoader技術,即使你不需要建立自己的ClassLoader,了解其原則也有助於更好地部署自己的應用。
重點註明:其實一個已經載入的類別是無法被更新的,如果你試著用同一個ClassLoader再次載入同一個類,就會得到異常(java.lang.LinkageError: duplicate classdefinition),我們只能夠重新建立一個新的ClassLoader實例來再次載入新類別。至於原來已經載入的類,開發人員不必去管它,因為它可能還有實例正在被使用,只要相關的實例都被內存回收了,那麼JVM就會在適當的時候把不會再使用的類卸載。
絕大部分Java程式都會使用3種系統提供的類別載入器
1.啟動類別載入器(Bootstrap ClassLoader),負責將存在
2.擴充類別載入器(ExtClassLoader),它負責
3.應用程式類別載入器(App-ClassLoader),透過cassLoader.getSystemClassLoader()取得,它負責載入使用者類別路徑(ClassPath)上所指定的類別庫,一般情況下這個是程式中默認的類別載入器.
雙親委託模式是Java設計者推薦給開發者的一種類別載入實作方式.雙親委託模型的工作過程是:如果一個類別載入器收到了類別載入請求,它首先不會自己去嘗試載入這個類,而是把這個請求委派給父類別載入器去完成.每一層次的類別載入器都是如此,因此所有的載入請求最終都會傳送到頂層的啟動類別載入器中,只有當父類別載入器沒有找到所需的類別時,子載入器才會嘗試自己去載入。雙親模式的好處是Java類別隨著它的類別載入器一起具備了一種具有優先權的層次關係。例如類Object,存放在rt.jar中,無論哪個類加載器加載這個類,最終都是委派給處於模型最頂端的啟動類加載,因此Object類在程序使用多種類加載器環境中依然能保證是同一個類別。相反,如果沒有使用雙親模型,就可能出現使用者自己編寫一個Object類,導致系統中出現多個不同的Object類,這樣Java類型體系中最基礎的行為也就無法保證。
以上是基於Java類別的載入方式之classloader類別載入器詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。
