Ioc

Ioc(Inverse of Control)概念

控制反轉:將某一接口的實現類的選擇控制權從調用類中移除,轉交給第三方決定,即有Spring容器藉由Bean配置來控制。

Ioc類型

從注入方法上劃分,Ioc主要可劃分爲三種類型:構造函數注入、屬性注入、接口注入。

.class文件介紹

Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲取Class的結構信息,如構造函數、屬性、方法等。

類實例、類描述對象以及類裝載器的關係:

類加載器ClassLoader

類加載器就是尋找類的字節碼文件並構造出類在JVM中的元信息對象的組件。

類加載器把一個類裝入JVM一般需要以下步驟:

  1. 裝載:查找和導入Class文件。
  2. 鏈接:執行校驗、準備和解析步驟、其中解析步驟是可選的。
  3. 校驗:檢查載入Class文件數據的正確性
  4. 準備:給靜態變量分配存儲空間。
  5. 解析:將符號引用轉化爲直接引用。
  6. 初始化:對類的靜態變量、靜態代碼塊進行初始化。(說明:非靜態代碼在類實例化時進行初始化)

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:類的成員變量的反射類。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章