好程式設計師Java培訓分享Java類載入的過程概述
好程式設計師Java 培訓分享 Java 類載入的過程概述:一 . 類的載入概述
當程式要使用某個類時,如果該類還未被載入到記憶體中,則系統會透過載入、連線、初始化三步來實現對這個類進行初始化。
1. 載入:是將 class 檔案讀入記憶體,併為之建立一個 Class 物件。任何類被使用時系統都會建立一個 Class 物件。
2. 連線:
(1) 驗證是否有正確的內部結構,並和其他類協調一致。
(2) 準備負責為類的靜態成員分配記憶體,並設定預設初始化值。
(3) 解析將類的二進位制資料中的符號引用替換為直接。
3. 初始化:就是我們以前講過的初始化步驟。
二. 類載入時機
當Java 程式首次透過下面 6 種方式使用某個類或介面時,系統會初始化該類或介面。
1. 建立類的例項。
2. 訪問類的靜態變數,或者為靜態變數賦值。
3. 呼叫類的靜態方法。
4. 初始化某個類的子類。
5. 直接使用 Java.exe 命令來執行某個主類。
6. 使用反射方式來強制建立某個類或介面對應的 Java.lang.Class 物件。
三. 類載入器的概述和分類
1. 類載入器負責將 .class 檔案載入到記憶體中,併為之生成對應的 Class 項,在 Java 中,類裝載器把一個類裝入 JVM 中,要經過以下步驟:
(1) 裝載:查詢和匯入 Class 檔案 ;
(2) 連結:把類的二進位制資料合併到 JRE 中 ;
校驗:檢查載入Class 檔案資料的正確性 ;
準備:給類的靜態變數分配儲存空間;
解析:將符號引用轉成直接引用;
(3) 初始化:對類的靜態變數,靜態程式碼塊執行初始化操作
(4) 當 JVM 啟動時,會形成由三個載入器組成的初始類載入器層次結構:
Bootstrap ClassLoader 根類載入器
Extension ClassLoader 擴充套件類載入器
System ClassLoader 系統類載入器
2. 類載入器的作用
Bootrap ClassLoader 被稱為引導 ( 也稱為原始或跟 ) 類載入器,它負責載入 Java 的核心類。跟類載入器不是 Java.lang.ClassLoader 的子類,而是 JVM 自身實現的。在 JDK 中 JRE 的 lib 目錄下 rt.jar 檔案中。
Extension ClassLoader 負責載入 JRE 擴充目錄中的 JAR 包的類,它的父類載入器是跟類載入器。在 JDK 中 JRE 的 lib 目錄下 ext 目錄。
System ClassLoader 負責在 JVM 啟動時載入來自 Java 命令的 -classpath 選項、 Java.class,path 系統屬性,或 CLASSPATH 指定的 jar 包和類歷經。系統可透過 ClassLoader 的靜態方法或區該系統類載入器。如果沒有特別指定,則使用者自定義的類載入器都已類載入器作為父載入器。
四. 反射概述
JAVA 反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,同時對於任意一個物件,都能夠呼叫它的任意一個方法和屬性,這種動態獲取的資訊以及動態呼叫物件方法的功能稱為 Java 語言的反射機制。
1. 要想解剖一個類 , 必須先要獲取到該類的位元組碼檔案物件,而解剖使用的就是 Class 類中的方法,所以先要獲取到每一個位元組碼檔案對應的 Class 型別的物件。
2. 每個類被載入後,系統會為該類生成一個對應的 Class 物件,透過該 Class 物件可以訪問到 JVM 中的這個類。
獲得Class 物件通常有三種方式:
(1) 使用 Class 類的 forName(String clazz) 靜態方法。
(2) 呼叫某個類的 class 屬性來獲取該類的的 Class 物件。
(3) 呼叫某個物件的 getClass() 方法,該方法是 Object 類的一個方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2726355/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- 好程式設計師java分享Java面試寶典:類的載入過程程式設計師Java面試
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享SpringBoot入門篇程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享Redis快取使用場景概述程式設計師JavaRedis快取
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享零基礎快速入門Java程式設計師Java
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java分享JVM類載入機制程式設計師JavaJVM
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- 好程式設計師Java培訓分享Java集合的兩種排序方法程式設計師Java排序
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件
- 好程式設計師Java培訓分享Java初學者必讀程式設計師Java
- 好程式設計師Java培訓Java容器類List和Set分析程式設計師Java
- 好程式設計師Java培訓分享演算法入門到精通之-演算法概述程式設計師Java演算法
- 好程式設計師Java培訓分享SpringBoot -啟動流程程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師Java培訓分享Java的三大框架怎麼學?程式設計師Java框架
- 好程式設計師Java培訓分享Java面試題集合篇一程式設計師Java面試題
- 好程式設計師Java培訓分享Java面試題集合篇二程式設計師Java面試題
- 好程式設計師Java培訓分享學習Java需要哪些基礎程式設計師Java
- 好程式設計師Java培訓分享Java中級面試題合集程式設計師Java面試題
- 好程式設計師Java培訓分享Java讀寫Properties配置檔案程式設計師Java
- 好程式設計師Java培訓分享學Java需要什麼基礎?程式設計師Java
- 好程式設計師Java培訓分享Java基礎知識總結程式設計師Java