JavaSE(十六)——反射
文章目錄
- 1. 概述
- 2. Class類
- 3. 獲取Class對象的三種方式
- 4. 獲取類的結(jié)構(gòu)信息
- 5. 創(chuàng)建類的對象
- 6. 調(diào)用指定的方法
- 7. 反射操作泛型
1. 概述
- Java可稱為“準(zhǔn)動態(tài)語言”,有一定的動態(tài)性,可以利用反射機(jī)制獲得類似動態(tài)語言(即在運(yùn)行時(shí)代碼可依據(jù)某些條件改變自身結(jié)構(gòu))的特性。
- 反射機(jī)制:在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。
- 要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。
- 反射相關(guān)的主要API
java.lang.Class: 代表一個類
java.lang.reflect.Method : 代表類的方法
java.lang.reflect.Field : 代表類的成員變量
java.lang.reflect.Constructor : 代表類的構(gòu)造器
2. Class類
-
在Object類中定義了方法:public final Class getClass(),此方法將被所有子類繼承。
-
(1)Class 本身也是一個類
(2)Class 對象只能由系統(tǒng)建立對象
(3)一個加載的類在 JVM 中只會有一個Class實(shí)例
(4)一個Class對象對應(yīng)的是一個加載到JVM中的一個.class文件
(5)每個類的實(shí)例都會記得自己是由哪個 Class 實(shí)例所生成
(6)通過Class可以完整地得到一個類中的所有被加載的結(jié)構(gòu)
(7) Class類是Reflection的根源,針對任何你想動態(tài)加載、運(yùn)行的類,唯有先獲得相應(yīng)的 Class對象 -
Class類的常用方法
-
Java內(nèi)存分析
3. 獲取Class對象的三種方式
-
① Object類的getClass()方法
② 靜態(tài)屬性class
③ Class類中靜態(tài)方法forName() -
案例:
-
運(yùn)行結(jié)果:
4. 獲取類的結(jié)構(gòu)信息
- 對象就包含了完整的類的結(jié)構(gòu)信息。可以通過這個對象看到類的結(jié)構(gòu)。這個對象就像一面鏡子,透過這個鏡子看到類的結(jié)構(gòu),如類名、屬性(字段)、方法、構(gòu)造器等。
- 代碼演示:
5. 創(chuàng)建類的對象
-
調(diào)用forName()返回的是Class,后需要調(diào)用newInstance()實(shí)例化
-
方式一: 調(diào)用Class對象的newInstance()方法,條件:①類必須有一個無參數(shù)的構(gòu)造器, ②類的構(gòu)造器的訪問權(quán)限需要足。
-
方式二:1)通過Class類的getDeclaredConstructor(Class … parameterTypes)取得本類的指定形參類型的構(gòu)造器 2)向構(gòu)造器的形參中傳遞一個對象數(shù)組進(jìn)去,里面包含了構(gòu)造器中所需的各個參數(shù)。 3)通過Constructor實(shí)例化對象
-
代碼:
-
運(yùn)行結(jié)果:
6. 調(diào)用指定的方法
-
通過反射,調(diào)用類中的方法,通過Method類完成。
① 通過Class類的getMethod(String name,Class…parameterTypes)方法取得 一個Method對象,并設(shè)置此方法操作時(shí)所需要的參數(shù)類型。
② 之后使用Object invoke(Object obj, Object[] args)進(jìn)行調(diào)用,并向方法中傳 遞要設(shè)置的obj對象的參數(shù)信息。 -
代碼:
-
若原方法聲明為private,則需要在調(diào)用invoke()方法之前,顯示調(diào)用方法對象的setAccessible(true)方法,將可訪問private的方法。
-
代碼:
7. 反射操作泛型
- Java采用泛型擦除的機(jī)制來引入泛型,Java中的泛型僅僅是給編譯器javac使用的,確保數(shù)據(jù)的安全性和免去強(qiáng)制類型轉(zhuǎn)換問題,但是一旦編譯完成,所有和泛型有關(guān)的類型全部擦除。
- 為了通過反射操作這些類型 , Java新增了 ParameterizedType , GenericArrayType , TypeVariable 和 WildcardType 幾種類型來代表不能被歸一到Class類中的類型但是又和原始類型齊名的類型。
- ParameterizedType : 表示一種參數(shù)化類型,比如Collection GenericArrayType : 表示一種元素類型是參數(shù)化類型或者類型變量的數(shù)組類型
TypeVariable : 是各種類型變量的公共父接口
WildcardType : 代表一種通配符類型表達(dá)式
總結(jié)
以上是生活随笔為你收集整理的JavaSE(十六)——反射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE(十五)——注解
- 下一篇: JavaSE(十七)——IO流之字节流