更新時(shí)間:2018-10-31 來源:黑馬程序員 瀏覽量:
一:反射的概念反射是一種機(jī)制,利用該機(jī)制可以在程序運(yùn)行過程中對類進(jìn)行解剖并操作類中的方法,屬性,構(gòu)造方法等成員。
反射的前提:必須先要獲取到該類的字節(jié)碼文件對象,即Class類型對象。
反射的實(shí)現(xiàn):
二:獲取Class對象三種方式:
1)通過類名.class獲取
舉例:
[Java] 純文本查看 復(fù)制代碼
2)通過Object類的成員方法getClass()方法獲取,對象名.getClass()
3)通過Class.forName("類的全路徑名")獲取,即Class.forName("cn.itcast.test2.Student");
舉例:
[Java] 純文本查看 復(fù)制代碼
三:[size=1.5em]Class對象相關(guān)方法
String getSimpleName(); 獲得簡單類名,只是類名,沒有包
String getName(); 獲取完整類名,包含包名+類名
T newInstance() ;創(chuàng)建此 Class 對象所表示的類的一個(gè)新實(shí)例。
要求:類必須有public的無參數(shù)構(gòu)造方法(已過時(shí),一般用class.getConstructor().newInstance()方法)
舉例:
[Java] 純文本查看 復(fù)制代碼
四: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ù)類型獲得一個(gè)方法對象,只能是獲取public修飾的
2. Method getDeclaredMethod("方法名", 方法的參數(shù)類型... 類型)
根據(jù)方法名和參數(shù)類型獲得一個(gè)方法對象,包括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修飾的屬性對象,返回?cái)?shù)組。
4. Field[] getDeclaredFields()
獲取所有的屬性對象,包括private修飾的,返回?cái)?shù)組。
Field類中常用方法
1. void set(Object obj, Object value)
Object get(Object obj)
2. void setAccessible(true);暴力反射,設(shè)置為可以直接訪問私有類型的屬性。
Class getType(); 獲取屬性的類型,返回Class對象。