1. 程式人生 > >java自學之路-day21

java自學之路-day21

產生 方式 方法 可變參 main方法 ext 都是 破壞 類文件

JAVA21

類加載器

類的加載

l 當程序要使用某個類時,如果還沒被加載到內存中,系統會就會通過加載 連接 初始化三個步驟對這個類進行初始化

l 加載

  1. 類的加載器將class文件讀入內存,放入方法區,並為之創建一個Class對象
  2. 是編譯後的class文件的一個對象
  3. 對象進入堆內存
  4. 又叫字節碼對象
  5. 可以使用不可以創建

l 連接

  1. 驗證 是否有正確的內部結構
  2. 為靜態成員分配空間 並設置默認初始化值
  3. 解析 將類的二進制數據中的符號引用變為直接引用 比如a=1 在內存中直接為1沒有了符號a

l 初始化

就是創建對象

類的加載時機

l 新建一個有main方法的類

l 其他類調用這個類中的方法 成員變量 或者實例化創建對象

l 其他類調用這個類的子類中的方法 成員變量 或者實例化對象

l 運行任何一個類都是先運行Object類的方法

=

類的加載器的組成

l 根類加載器

  1. 負責核心類庫的加載
  2. Jre目錄中的rt.jar
  3. 項目中的 JRESystemLibrary 中的rt.jar

l 擴展加載器

  1. 加載擴展的類
  2. Jre中的ext文件夾
  3. 項目中的 JRESystemLibrary 中的ext文件夾中的jar包

l 系統加載器

  1. 負責加載自己寫的類
  2. 負責加載第三方工具類

反射

概念

l 運行時期對於任何一個類

l 都能知道這個類的所有屬性和方法

l 對於任何一個對象都能調用他的任何一個方法和屬性

l 這種動態獲取信息及動態調用對象的方法的功能就叫做java語言的反射機制

功能

  1. 已經完成的一個類如果要增加功能在不改源碼的前提下怎麽添加
  2. 將新功能類的字節碼文件也就是編譯後的class文件解剖
  3. 在源類中調用即可

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 快速方式

  1. 被反射的類必須具有空參構造方法
  2. 構造方法必須是公共的

反射獲取私有構造方法

l 不推薦破壞了程序的封裝性安全性

l getDeclaredConstructors()

l 獲取所有的構造方法

l 返回一個Constructor類型的數組

l 示例

l getDeclaredConstructor(class..c)

l 可變參數

l 返回一個私有的構造方法

l 示例

不能訪問私有的

l setAccessibale 對權限的訪問

反射獲取成員變量

l Class類中的方法 getFields() getDeclaredFields()則是獲取私有的

  1. 獲取所有公共的所有公共類的成員變量
  2. 返回值Field[]數組

l 獲取指定成員變量

反射獲取空參數成員方法

l getMethods()

  1. 獲取Class文件中的所有公共成員方法包括繼承的
  2. Method類是描述成員方法的對象

方法很多都是公共的

l getMethod()

  1. 方法參數 方法名和可變參數
  2. 返回一個method對象

l 使用獲得的方法

Invoke()

  1. 運行method獲得的方法
  2. 參數是一個類文件的對象

反射獲取有參數的成員方法

反射泛型擦除

l 存儲規定泛型之外的元素

l 偽泛型 編譯後的class文件沒有泛型可以直接獲取class文件對象獲取方法

l 不能使用曾強for或者叠代器遍歷 所以只是為了練習反射

通過配置文件

l 原理

l 實現

java自學之路-day21