1、概述:
簡要的來講,Java中的反射機制就是容許程序在運行期間經過Reflection的Api來取得任何類的內部信息,而且可以直接操做任意對象的內部屬性和方法。數組
2、Class類:
1.反射從Class類開始
要想使用反射,首先咱們須要獲得Class對象,而後才能經過Class對象獲取Constructor、Field、Method等對象。spa
2.獲得Class對象
- 經過對象獲取Class對象:obj.getClass();
- 經過類名點上class:假設有一個Person類,Person.class這個樣子
- 經過類的全限定類名來獲取Class對象:Class.forName("com.buwei.Person")
- 注:一個.class對象,在方法區中只對應一個Class對象
3.加載類
咱們都知道main方法是程序的入口,name是否是全部的class文件都會在main方法執行以前就已經加載到方法區中了呢,答案是否是的。通常狀況下只有須要執行到某個類的代碼時,纔回去ClassPath中加載class文件。若是程序從頭至尾都沒有使用到某個類,那麼這個類對應的class文件就不會被加載到內存。對象
可能致使一個類被加載的可能有:接口
- 使用一個類的靜態方法
- 使用一個類的靜態屬性
- 建立這個類的對象
- 使用Class.forName()方法加載類
- 反序列化一個類的對象
- 加載一個類的子類時,也會加載其父類
- 加載一個類時,也會加載與該類相關的類
- 注:若是當前類沒有被加載過,纔會去加載,若是已經加載到方法區中了,就不可能再去加載。
4.Class類的方法
方法1:內存
- String getName():返回類名;
- String getSimpleName():返回簡單類名,不包含包名,但數組類型使用它比價方便;
- Class getSuperClass():獲取父類,Object.class.getSuperClass()返回null;
- int getModifiers():獲取類的全部修飾符信息;
方法2:rem
- Constructor getConstructor(Class... parameterTypes):經過指定的參數類型獲取共有的構造器反射對象;
- Constructor[] getConstructors():獲取全部的共有構造器;
- Constructor getDeclaredConstructor(Class ... paremeterTypes):經過指定參數類型獲取構造器反射對象,包含私有構造器對象
- Constructor[] getDeclaredConstructors():獲取全部構造器對象。包含私有構造器;
- Field getField(String name):經過名字獲取共有屬性反射對象,包含父類中聲明的共有屬性;
- Field[] getFields():獲取全部公有屬性反射對象,包含父類中聲明的公有屬性;
- Field getDeclaredField(String name):經過名字獲取本類中的某個屬性,包含本類的private屬性,可是不包含父類中聲明的任何屬性;
- Field[] getDeclaredFields():獲取本類中聲明的全部屬性,包含private屬性,但不包含父類中聲明的任何屬性;
- Method getMethod(String name,Class ... parameterTypes):經過方法名和方法參數類型獲取方法反射對象
- Method[] getMethods():獲取全部公有方法,包含父類中的公有方法,但不包含任何私有方法;
- Method getDeclaredMethod(String name, Class… parameterTypes):經過方法名和方法參數類型獲取本類中聲明的方法的反射對象,包含本類中的私有方法,但不包含父類中的任何方法;
- Method[] getDeclaredMethods():獲取本類中全部方法,包含本類中的私有方法,但不包含父類中的任何方法。
方法3:字符串
- boolean isArray():是否爲數組類型;
- boolean isAnnotation():是否爲註解類型;
- boolean isAnnotationPresent(Class annotationClass):當前類是否被annotationClass註解了;
- boolean isEnum:是否爲枚舉類型;
- boolean isInterface:是否爲接口類型;
- boolean isPrimitive:是否爲基本類型;
- boolean isSynthetic:是否爲引用類型;
方法4:get
- T newInstance:使用本類的無參構造器來建立本類的對象;
3、其餘反射類
其餘反射類偶在Java.lang.reflect包下it
1.AccessibleObject
AccessibleObject類是Constructor、method、Field三個類的父類io
- Annotation getAnnotation(Class annotationClass):獲取做用在當前成員上的annotationClass類型的註解對象;
- Annotation[] getAnnotations():獲取做用在當前成員上的全部註解對象;
- boolean isAccessible():判斷當前成員是否可訪問;
- void setAccessible(boolean flag):設置當前成員是否可訪問。
2.Constructor
- String getName():獲取構造器名;
- int getModifiers():獲取構造器上的全部修飾符信息;
- Class getDeclaringClass():獲取構造器所屬的類型;
- Class[] getParameterTypes():獲取構造器的全部參數的類型;
- Class[] getExceptionTypes():獲取構造器上聲明的全部異常類型;
- T newInstance(Object… initargs):經過構造器反射對象調用構造器。
3.Method
- String getName():獲取方法名;
- int getModifiers():獲取方法上的全部修飾符信息;
- Class getDeclaringClass():獲取方法所屬的類型;
- Class[] getParameterTypes():獲取方法的全部參數的類型;
- Class[] getExceptionTypes():獲取方法上聲明的全部異常類型;
- Class getReturnType():獲取方法的返回值類型;
- Object invode(Object obj, Object… args):經過方法反射對象調用方法,若是當前方法是實例方法,那麼當前對象就是obj,若是當前方法是static方法,那麼能夠給obj傳遞null。args表示是方法的參數;
4.Field
- String getName():獲取屬性名;
- int getModifiers():獲取屬性上的全部修飾符信息;
- Class getDeclaringClass():獲取屬性所屬的類型;
- Class getType():獲取當前屬性的類型;
- Object get(Object obj):獲取obj對象的當前屬性值;
- void set(Object obj, Object value):設置obj對象的當前屬性值爲value;
- XXX getXXX(Object obj):若是當前屬性爲基本類型,可使用getXXX()系列方法獲取基本類型屬性值。假如當前屬性爲int類型,那麼可使用getInt(Object obj)方法獲取obj對象的當前屬性值;
5.Modifier
modifier類有一系列的static方法用來解析其餘getModifiers()方法返回的int值。
Method m = … int m = m.getModifiers(); boolean b1 = Modifier.isAbstract(m);//解析m中是否包含abstract修飾 boolean b2 = Modifier.isStatic(m);//解析m中是否包含static修飾 String s = Modifiers.toString(m);//把全部修飾都轉換成字符串 |