Ioc(Inverse of Control)概念
控制反轉:將某一接口的實現類的選擇控制權從調用類中移除,轉交給第三方決定,即有Spring容器藉由Bean配置來控制。
Ioc類型
從注入方法上劃分,Ioc主要可劃分爲三種類型:構造函數注入、屬性注入、接口注入。
.class文件介紹
Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲取Class的結構信息,如構造函數、屬性、方法等。
類實例、類描述對象以及類裝載器的關係:
類加載器ClassLoader
類加載器就是尋找類的字節碼文件並構造出類在JVM中的元信息對象的組件。
類加載器把一個類裝入JVM一般需要以下步驟:
- 裝載:查找和導入Class文件。
- 鏈接:執行校驗、準備和解析步驟、其中解析步驟是可選的。
- 校驗:檢查載入Class文件數據的正確性
- 準備:給靜態變量分配存儲空間。
- 解析:將符號引用轉化爲直接引用。
- 初始化:對類的靜態變量、靜態代碼塊進行初始化。(說明:非靜態代碼在類實例化時進行初始化)
ClassLoder及其子類
類裝載工作由ClassLoader及其子類完成。ClassLoader是一個重要的Java運行時系統組件,他負責在運行時查找和裝入Class字節碼文件。
JVM在運行時會產生3個ClassLoader:根裝載器、ExtClassLoader(擴展類)以及AppClassLoader(應用類裝載器)。
根裝載器:不是ClassLoader的子類,是用C++編寫的因此在java不可見。根裝載器負責裝載JRE的核心庫。
ExtClassLoader:負責裝載JRE擴展目錄ext中的jar包。
AppClassLoader:負責裝載ClassPath路徑下的類包。
說明:根裝載器時ExtClassLoader的父裝載器、ExtClassLoader是AppClassLoader的父裝載器。默認情況下使用AppClassLoader裝載應用程序。
示例:
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current:" + loader);
System.out.println("parent:" + loader.getParent());
System.out.println("grandparent:" + loader.getParent().getParent());
/*
* 輸出結果 current:jdk.internal.loader.ClassLoaders$AppClassLoader@15db9742
* parent:jdk.internal.loader.ClassLoaders$PlatformClassLoader@279f2327
* grandparent:null
*/
}
}
JVM裝載機制
JVM採用“全盤負責委託機制”,“全盤負責”是指當一個ClassLoader裝載一個類時,除非顯示的使用另一個ClassLoader,該類所有的依賴以及引用類都是有這個ClassLoader負責。“委託機制”是指先委託父類裝載器尋找目標類,只有在找不到的情況下才從自己的類路徑下查找。
JAVA反射機制
Class反射對象描述類語義結構,可以從Class對象中獲取構造函數、成員變量、方法類等類元素的反射對象。並以編程的方式通過這些反射對象對目標類對象進行操作。這些反射對象類在java.lang.reflect包中定義。
主要的反射類:
Constructor:類的構造函數反射類。
Method:類方法的反射類。
Field:類的成員變量的反射類。