全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

反射的基本使用

更新時(shí)間:2018-10-31 來(lái)源:黑馬程序員 瀏覽量:

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

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

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

  1540964692617_1.jpg

  二:獲取Class對(duì)象三種方式:

  1)通過(guò)類(lèi)名.class獲取

  舉例:

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

  1540964715081_2.jpg

  2)通過(guò)Object類(lèi)的成員方法getClass()方法獲取,對(duì)象名.getClass()

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

  舉例:

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

  1540964734834_3.jpg

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

  String getSimpleName(); 獲得簡(jiǎn)單類(lèi)名,只是類(lèi)名,沒(méi)有包

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

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

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

  舉例:

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

  1540964747050_4.jpg

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

  1. Constructor getConstructor(Class... parameterTypes)

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

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

  2. Constructor getDeclaredConstructor(Class... parameterTypes)

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

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

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

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

  Constructor類(lèi)中的常用方法:

  1. T newInstance(Object... initargs)

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

  2. void setAccessible(true)

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

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

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

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

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

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

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

  獲取所有的public修飾的成員方法,包括父類(lèi)中。

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

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

  Method類(lèi)中常用方法

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

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

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

  2. void setAccessible(boolean flag)

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

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

  1. Field getDeclaredField(String name)

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

  2. Field getField(String name)

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

  3. Field[] getFields()

  獲取所有的public修飾的屬性對(duì)象,返回?cái)?shù)組。

  4. Field[] getDeclaredFields()

  獲取所有的屬性對(duì)象,包括private修飾的,返回?cái)?shù)組。

  Field類(lèi)中常用方法

  1. void set(Object obj, Object value)

  Object get(Object obj)

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

  Class getType(); 獲取屬性的類(lèi)型,返回Class對(duì)象。



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

分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!