更新時(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):
二:獲取Class對(duì)象三種方式:
1)通過(guò)類(lèi)名.class獲取
舉例:
[Java] 純文本查看 復(fù)制代碼
2)通過(guò)Object類(lèi)的成員方法getClass()方法獲取,對(duì)象名.getClass()
3)通過(guò)Class.forName("類(lèi)的全路徑名")獲取,即Class.forName("cn.itcast.test2.Student");
舉例:
[Java] 純文本查看 復(fù)制代碼
三:[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ù)制代碼
四: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ì)象。