引言
本文主要介紹Java中,有關反射機制、類的加載過程、以及控制反轉方面的內容。
Java 反射機制
Java創建對象的方式有哪些:new、反射、反序列化、克隆
class對象獲取的方法有哪些:類名.class、getClass、forName、classLoader.loadClass(‘包類名全路徑’)---> 區別在于有沒有初始化步驟(statis)
類的加載順序
Class裝載過程:加載、鏈接(驗證、準備、解析)、初始化
Class初始化的詳細步驟:
如果這個類還沒有被加載和鏈接,那就先進行加載和鏈接
如果這個類存在父類,并且父類還沒有初始化,那就先初始化直接父類
如果類型存在初始化語句,一次執行初始化語句
Class初始化6大時機:
創建類的實例(new、class.newInstance、constructor.newInstance)
訪問類中的某個靜態變量,或者對靜態變量進行賦值
調用類的靜態方法
Class.forName
完成子類的初始化
程序的引導入口
JDBC編程為什么用Class.forName類進行加載驅動?--> 通過classforName 進行初始化statis、注冊Driver
Java反射
優點:增加代碼的靈活度、可讀性更強;
缺點:(在量大的情況下)相比較于直接調用性能會下降、封裝性不好(會暴露內部安全)
反射慢的原因:尋找class字節碼的過程、判斷安全機制
Java反射中,如果需要對私有的屬性進行訪問,需要設置強制訪問(setAccessible)。
class.newInstance()的本質是什么?--> 該方案會首先找指定class中默認的無參數的構造函數(如果該class已經設定了一個新的有參數的拋出異常)
Java控制反轉(Spring IOC和DI)
IOC(控制反轉),把創建對象的控制權交給程序(容器):構造器、靜態工廠、實例方法
DI(依賴注入),對象創建過程中,容器動態構建所需的對象:構造器、setter函數