一起來學大數據|Java中的類加載器

一起來學大數據|Java中的類加載器

昨天我們學習了Java中的反射,其原理應用了Java運行中的.class文件。回頭想想,我們以前在編程的過程中肯定見過這樣的一個異常Java.lang.ClassNotFoundExcetpion,這背後就涉及到了java技術體系中的類加載。今天,讓我們來一起了解一下。

Java類加載機制

Java中的類加載機制是java技術體系中算是比較核心的一部分,儘管我們平時接觸的並不是很多,而且類加載器也並不是和大部分軟件開發工作人員經常打交道的。但是我們在這裡學習Java的累加器的背後的機制,能夠幫助我們理解並有助於排查程序中出現的類加載失敗等技術問題,就好比上篇文章的放射,學習了這些,你回頭看的時候就很容易理解啦。

為什麼使用類加載

在我們學習的Java語言面裡,類加載是當我們的程序運行的時候完成的,這樣的方式儘管會給類加載時候的主機稍微的添加點點的性能開銷以外,就是能給java程序提供高度的靈活性。

類加載的過程

一起來學大數據|Java中的類加載器

圖1 類加載過程

我們在完成編寫以.java為後綴的文件後,這些.java文件就會通過java中的編譯器編譯成後綴名字是.class的文件。我們走進.class文件之後,我們就可以看到這裡面存儲著java代碼在編譯轉換後的虛擬指令。

當我們準備使用這個類的時候,jvm虛擬就就會加載它的.class文件,並且創建對應的.class對象,我們將這種class文件加載到jvm虛擬機的內存的這個過程稱之為類加載

一起來學大數據|Java中的類加載器

圖2 類加載過程

Loading(加載):加載就是我們把類的信息從文件中取得之後,再載入到JVM虛擬機的方法區/常量區裡,也就是內存裡面。

Verifying(驗證):在這行模塊我們會校驗加載的結構是不是符合Java語言規範和JVM規範的描述。在這個過程中,是類轉載的中最繁雜的一塊,在時間上的花費也是最長的一塊。我們使用的排錯程序,有一大部分也是在檢查這一部分的錯誤。

Preparing(準備):檢驗通過之後,我們會分配一種結構去存儲類的信息,我們在這個結構中存儲了我們在類中定義的成員變量,方法和接口的數據信息。

Resolving(解析):解析就是我們把這個類中常量池中的所有的 符號引用 改變成 直接引用。

Initializing(初始化):解析完成,我們就可以提取類中的變量,並且使之初始化成為合適的值。執行靜態的初始化程序,可以把靜態變量初始化成指定的數值

一起來學大數據|Java中的類加載器

加載具體步驟

在這裡我們對加載要重點掌握,其餘的過程至於要了解即可。

相對於其他階段,加載階段,也就是說獲取類的2進制的字節流的這個階段,是我們在程序開發期可控性最強的一個階段。原因是,加載階段可以用我們系統提供的類加載器(ClassLoader)去獲取類的2進制的字節流,當然這個也可以由我們自定義的類加載器去獲取我們要的字節流。

當我們的加載完成之後,jvm虛擬機外部的2進制字節流就會按照jvm所需要的格式存儲在方法區中,其中的數據存儲格式都是由jvm自行定義實現。然後在Java的堆中實例化一個java.lang.Class類的對象,這個對象就是我們程序訪問方法區中的數據的外部接口。


以上就是我們對Java中類加載器的介紹,看完是不是有一絲的清新感呢?

學習完了反射,動態代理,明天我們將學習動態代理,找代理好辦事。

有幫助的大家的話,點個關注來個贊,讓優秀成為一種習慣。

感謝堅持關注的朋友~

一起來學大數據|Java中的類加載器

世界很大,幸好有你~

歡迎在評論區留下你的問題或困惑,我將每天與你分享我的觀點和心得。

聚焦最新科技諮訊,探尋未來智能領域,我是Mario女陶。


分享到:


相關文章: