java自學之路-day21
JAVA21
類加載器
類的加載
l 當程序要使用某個類時,如果還沒被加載到內存中,系統會就會通過加載 連接 初始化三個步驟對這個類進行初始化
l 加載
- 類的加載器將class文件讀入內存,放入方法區,並為之創建一個Class對象
- 是編譯後的class文件的一個對象
- 對象進入堆內存
- 又叫字節碼對象
- 可以使用不可以創建
l 連接
- 驗證 是否有正確的內部結構
- 為靜態成員分配空間 並設置默認初始化值
- 解析 將類的二進制數據中的符號引用變為直接引用 比如a=1 在內存中直接為1沒有了符號a
l 初始化
就是創建對象
類的加載時機
l 新建一個有main方法的類
l 其他類調用這個類中的方法 成員變量 或者實例化創建對象
l 其他類調用這個類的子類中的方法 成員變量 或者實例化對象
l 運行任何一個類都是先運行Object類的方法
=
類的加載器的組成
l 根類加載器
- 負責核心類庫的加載
- Jre目錄中的rt.jar
- 項目中的 JRESystemLibrary 中的rt.jar
l 擴展加載器
- 加載擴展的類
- Jre中的ext文件夾
- 項目中的 JRESystemLibrary 中的ext文件夾中的jar包
l 系統加載器
- 負責加載自己寫的類
- 負責加載第三方工具類
反射
概念
l 運行時期對於任何一個類
l 都能知道這個類的所有屬性和方法
l 對於任何一個對象都能調用他的任何一個方法和屬性
l 這種動態獲取信息及動態調用對象的方法的功能就叫做java語言的反射機制
功能
- 已經完成的一個類如果要增加功能在不改源碼的前提下怎麽添加
- 將新功能類的字節碼文件也就是編譯後的class文件解剖
- 在源類中調用即可
Class文件的產生過程
l 類加載器加載新功能類 產生一個class文件對象
l 用這個文件對象調用新功能類的方法
l Java.lang.Class類描述文件對象的類 文件對象就是這個類的類型
獲取class文件對象的三種方式
l 對象獲取
l 類名獲取
l Class類的靜態方法獲取
l 三個方法獲得的對象都是同一個
反射獲取class文件中的構造方法
l 運行構造方法相當於創建了對象
l getConstructors()獲取class文件對象中的所有公共的構造方法
l 返回Constructors類型的數組
l 獲取一個指定構造方法
可變參數
l 運行
NewInstance()
l 獲取有參數的構造方法並運行
l 快速方式
- 被反射的類必須具有空參構造方法
- 構造方法必須是公共的
反射獲取私有構造方法
l 不推薦破壞了程序的封裝性安全性
l getDeclaredConstructors()
l 獲取所有的構造方法
l 返回一個Constructor類型的數組
l 示例
l getDeclaredConstructor(class..c)
l 可變參數
l 返回一個私有的構造方法
l 示例
不能訪問私有的
l setAccessibale 對權限的訪問
反射獲取成員變量
l Class類中的方法 getFields() getDeclaredFields()則是獲取私有的
- 獲取所有公共的所有公共類的成員變量
- 返回值Field[]數組
l 獲取指定成員變量
反射獲取空參數成員方法
l getMethods()
- 獲取Class文件中的所有公共成員方法包括繼承的
- Method類是描述成員方法的對象
方法很多都是公共的
l getMethod()
- 方法參數 方法名和可變參數
- 返回一個method對象
l 使用獲得的方法
Invoke()
- 運行method獲得的方法
- 參數是一個類文件的對象
反射獲取有參數的成員方法
反射泛型擦除
l 存儲規定泛型之外的元素
l 偽泛型 編譯後的class文件沒有泛型可以直接獲取class文件對象獲取方法
l 不能使用曾強for或者叠代器遍歷 所以只是為了練習反射
通過配置文件
l 原理
l 實現
java自學之路-day21