黑馬程序員----看視頻後對反射總結做的總結

---------------------- android培訓java培訓、期待與您交流! ----------------------

反射總結

一:反射的基石:Class類

類Class的總結

A:類Class代表的什麼樣的事物

java.lang 類 Class<T>

T - 由此 Class 對象建模的類的類型。例如,String.class 的類型是 Class<String>。如果將被建模的類未知,則使用 Class<?>。java程序中的各個java類屬於同一類事物,描述這類事物的java類名就是Class。Class 類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,註釋是一種接口。每個數組屬於被映射爲 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示爲 Class 對象。Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。

 

B : 如何得到各個字節碼對應的實例對象(Class類型)

Class自身並沒有什麼構造方法

三種方法:

類名:class,例如Date.class

對象:getClass(),例如New Date().getClass()

靜態方法Class.forName(“類名”);例如Class.forName("java.lang.String");返回類的字節碼,有兩種情況,如果該字節碼曾經被加載進類存,如果該字節碼未加載,就通過類加載器先將該類加載,將它緩存在java虛擬機中,以後要得到它的字節碼就不用加載了。

 

C : 預定義的Class實例對象

9個預定義的Class實例對象:有九種預定義的 Class 對象,表示八個基本類型和 void。這些類對象由 Java 虛擬機創建,與其表示的基本類型同名,即 boolean、byte、char、short、int、long、float 和 double。

public boolean isPrimitive()

判定指定的 Class 對象是否表示一個基本類型。 當且僅當該類表示一個基本類型時,才返回 true

D:int.class與Integer.class、int.class與Integer.TYPE

int.class與Integer.class返回的類的Class實例不相同

int.class與Integer.TYPE都返回基本類型 int 的 Class 實例。

總之只要在源文件中出現的類型,都有各自的Class實例對象,例如int[]、void

 

二:反射

反射就是把java類中的各個成分映射成相應的Java類。例如。一個JAVA源文件中,一個類的組成要素:成員變量、成員方法、構造函數、包等信息通過反射都一一對應着一個java類。對成員變量通過反射可以獲得所有已定義的數據成員,並可以通過方法來操作私有成語。

對成員方法可通過反射獲取其方法類,並調用其中方法。表示java類的Class類顯然要提供一系列的方法,來獲取其中的變量、方法、修飾符、包等信息,這些信息就是相應的實例對象,他們是Field、Method、Constructor、Package等等。一個類中的每個成員都可以用相應的反射API類一個實例對象來表示,通過調用Class類的方法可以得到這些實例對象。

 

A:Constructor類代表某個類中的一個構造方法

得到某個類中的所有構造方法:

         Constructor[]  consturctors = Class.forName(“java.lang.String”).getConstructors();

得到某個類中的一個構造方法:

獲得方法是傳入形參的Class類的實例,也就是用到類型

         Constructor  constructor = class.forName().getConstructor(StringBuffer.class);

創建實例對象:

   通常方式:String str = new String(new StringBufffer(“abc”));

//調用獲得的方法時要用到上面相同類型的實例對象

   反射方式:String str = (String)constructor.newInstance(new StringBufffer(“abc”));

Class.newInstance()方法:通過無參構造方法獲取實例

         例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();

該方法內部先得到默認的構造方法,然後在用該構造方法創建實例對象。此處用到緩存機制保存默認構造方法的對象。

 

B : Field類:成員變量類

Field類代表某個類中的一個成員變量。

獲取類的一個共有成員:getField()僅僅只是獲得public成員

Field  fieldX = Class.forName(“cn.itcast.ReflectPoint”).getField(“y”);

獲取類的所有共有成員:getField()僅僅只是獲得public成員

Field[]  fields = Class.forName(“cn.itcast.ReflectPoint”).getFields();

獲得類中一個已聲明的成員變量(包括私有成員變量)

Filed  fieldX = Class.forName(“cn.itcast.ReflectPoint”).getDeclaredField(“y”);

------此處主要,如果獲得的是private成員變量,還要將其設爲可訪問才能操作它

         fieldX.setAccessible(); 暴力反射

獲取類中所有已聲明的成員變量(包括私有成員變量)

Filed[]  fields = Class.forName(“cn.itcast.ReflectPoint”).getDeclaredFields();

 

C :Method類

代表類裏面的方法,不是對象的方法,是那份字節碼的方法。

Method類代表某個類中的一個成員方法

得到類中的某一個共有方法:

Method  method = Class.forName(“cn.itcast.ReflectPoint”).getMethod(“main”,Stirng[].class)

得到類中的所以共有方法:

Method[]  methods = Class.forName(“cn.itcast.ReflectPoint”).getMethods()

得到類中某一個已聲明的方法,包括private方法

Method  method = String.class.getDeclaredMethod(“charAt”,int.class);

得到類中某所有已聲明的方法,包括private方法

Method[]  methods = String.class.getDeclaredMethods();

通過上面的method實例對象調用invoke方法來處理。

 

附加知識:

public Object invoke(Object obj,Object... args)

對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。個別參數被自動解包,以便與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。

如果底層方法是靜態的,那麼可以忽略指定的 obj 參數。該參數可以爲 null。如果底層方法所需的形參數爲 0,則所提供的 args 數組長度可以爲 0 或 null。如果底層方法是實例方法,則使用動態方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基於目標對象的運行時類型的重寫時更應該這樣做。 如果底層方法是靜態的,並且尚未初始化聲明此方法的類,則會將其初始化。如果方法正常完成,則將該方法返回的值返回給調用者;如果該值爲基本類型,則首先適當地將其包裝在對象中。但是,如果該值的類型爲一組基本類型,則數組元素 被包裝在對象中;換句話說,將返回基本類型的數組。如果底層方法返回類型爲 void,則該調用返回 null。

 

D: 數組的反射

具有相同維數和類型的數組屬於同一個類型(不考慮數組元素個數),即他們具有相同的Class實例對象。代表數組的Class實例對象的getSuperClass()方法返回的父類的Object類的對應Class。

基本類型的一維數組可以被當作Objdect類型使用,不能當做Object[]類型使用;非基本數據類型的一維數組,既可以當做Object類型使用,又可以當做Object[]類型使用。

 

 ---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培訓</a>、<a href="http://edu.csdn.net/heima" target="blank">java培訓</a>、期待與您交流! ----------------------

詳細請查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

---------------------- android培訓java培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net/heima
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章