在上一篇文章中,我們詳細的介紹了Java,那麼這些Class文件是如何被加載到內存,由虛擬機來直接使用的呢?這就是本篇博客將要介紹的——類加載過程。 1、類的生命周期 類從被加載到虛擬機內存開始,到卸載出內存為止,其聲明周期流程如下: 上圖中紅色的5個部分(加載、驗證、準備、初始化、卸載)順序是確定的,也就是說,類的加載過程必須按照這種順序按部就班的開始。這裏的"開始"不是按部就班的"進行"或者"完成",因為這些階段通常是互相交叉混合的進行的,通常會在一個階段執行過程中調用另一個階段。 2、加載 "加載"階段是"類加載"生命周期的第一個階段。在加載階段,虛擬機要完成下面三件事: ①、通過一個類的全限定名來獲取定義此類的二進制字節流。 ②、將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。 ③、在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的訪問入口。 PS:類的全限定名可以理解為這個類存放的絕對路徑。方法區是JDK1.7以前定義的運行時數據區,而在JDK1.8以後改為元數據區(Metaspace),主要用於存放被Java虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。詳情可以參考這邊該系列的第二篇文章——。 另外,我們看第一點——通過類的權限定名來獲取定義此類的二進制流,這裏並沒有明確指明要從哪裡獲取以及怎樣獲取,也就是說並沒有明確規定一定要我們從一個 Class 文件中獲取。基於此,在Java的發展過程中,充滿創造力的開發人員在這個舞台上玩出了各種花樣: 1、從 ZIP 包中讀取。這稱為後面的 JAR、EAR、WAR 格式的基礎。 2、從網絡中獲取。比較典型的應用就是 Applet。 3、運行時計算生成。這就是動態代理技術。 4、由其它文件生成。比如 JSP 應用。 5、從數據庫中讀取。 加載階段完成后,虛擬機外部的二進制字節流就按照虛擬機所需的格式存儲在方法區中,然後在Java堆中實例化一個 java.lang.Class 類的對象,這個對象將作為程序訪問方法區...