首頁技術(shù)文章正文

反射的基本使用

更新時間:2018-10-31 來源:黑馬程序員 瀏覽量:

  一:反射的概念反射是一種機(jī)制,利用該機(jī)制可以在程序運(yùn)行過程中對類進(jìn)行解剖并操作類中的方法,屬性,構(gòu)造方法等成員。

  反射的前提:必須先要獲取到該類的字節(jié)碼文件對象,即Class類型對象。

  反射的實(shí)現(xiàn):

  1540964692617_1.jpg

  二:獲取Class對象三種方式:

  1)通過類名.class獲取

  舉例:

  [Java] 純文本查看 復(fù)制代碼

  1540964715081_2.jpg

  2)通過Object類的成員方法getClass()方法獲取,對象名.getClass()

  3)通過Class.forName("類的全路徑名")獲取,即Class.forName("cn.itcast.test2.Student");

  舉例:

  [Java] 純文本查看 復(fù)制代碼

  1540964734834_3.jpg

  三:[size=1.5em]Class對象相關(guān)方法

  String getSimpleName(); 獲得簡單類名,只是類名,沒有包

  String getName(); 獲取完整類名,包含包名+類名

  T newInstance() ;創(chuàng)建此 Class 對象所表示的類的一個新實(shí)例。

  要求:類必須有public的無參數(shù)構(gòu)造方法(已過時,一般用class.getConstructor().newInstance()方法)

  舉例:

  [Java] 純文本查看 復(fù)制代碼

  1540964747050_4.jpg

  四:Class類中與Constructor相關(guān)方法:

  1. Constructor getConstructor(Class... parameterTypes)

  根據(jù)參數(shù)類型獲取構(gòu)造方法對象,只能獲得public修飾的構(gòu)造方法。

  如果不存在對應(yīng)的構(gòu)造方法,則會拋出 java.lang.NoSuchMethodException 異常。

  2. Constructor getDeclaredConstructor(Class... parameterTypes)

  根據(jù)參數(shù)類型獲取構(gòu)造方法對象,包括private修飾的構(gòu)造方法。

  如果不存在對應(yīng)的構(gòu)造方法,則會拋出 java.lang.NoSuchMethodException 異常。

  3. Constructor[] getConstructors() 獲取所有的public修飾的構(gòu)造方法

  4. Constructor[] getDeclaredConstructors() 獲取所有構(gòu)造方法,包括privat修飾的

  Constructor類中的常用方法:

  1. T newInstance(Object... initargs)

  根據(jù)指定參數(shù)創(chuàng)建對象。

  2. void setAccessible(true)

  暴力反射,設(shè)置為可以直接訪問私有類型的構(gòu)造方法。

  五:Class類中與Method相關(guān)的方法:

  1. Method getMethod("方法名", 方法的參數(shù)類型... 類型)

  根據(jù)方法名和參數(shù)類型獲得一個方法對象,只能是獲取public修飾的

  2. Method getDeclaredMethod("方法名", 方法的參數(shù)類型... 類型)

  根據(jù)方法名和參數(shù)類型獲得一個方法對象,包括private修飾的

  3. Method[] getMethods() (了解)

  獲取所有的public修飾的成員方法,包括父類中。

  4. Method[] getDeclaredMethods() (了解)

  獲取當(dāng)前類中所有的方法,包含私有的,不包括父類中。

  Method類中常用方法

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

  根據(jù)參數(shù)args調(diào)用對象obj的該成員方法

  如果obj=null,則表示該方法是靜態(tài)方法

  2. void setAccessible(boolean flag)

  暴力反射,設(shè)置為可以直接調(diào)用私有修飾的成員方法

  六:Class類中與Field相關(guān)方法

  1. Field getDeclaredField(String name)

  根據(jù)屬性名獲得屬性對象,包括private修飾的

  2. Field getField(String name)

  根據(jù)屬性名獲得屬性對象,只能獲取public修飾的

  3. Field[] getFields()

  獲取所有的public修飾的屬性對象,返回數(shù)組。

  4. Field[] getDeclaredFields()

  獲取所有的屬性對象,包括private修飾的,返回數(shù)組。

  Field類中常用方法

  1. void set(Object obj, Object value)

  Object get(Object obj)

  2. void setAccessible(true);暴力反射,設(shè)置為可以直接訪問私有類型的屬性。

  Class getType(); 獲取屬性的類型,返回Class對象。



作者:黑馬程序員JavaEE培訓(xùn)學(xué)院
首發(fā):http://java.itheima.com/

分享到:
在線咨詢 我要報名
和我們在線交談!