Java反射機制是的運行狀態中(.calsss),對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。java
在平常的第三方開發過程當中,常常會遇到某個類的某個成員變量、方法或是屬性是私有的或是隻對系統應用開放,這時候就能夠利用Java的反射機制經過反射來獲取所需的私有成員或是方法。用到反射的經常使用框架有spring\dubbo等等spring
類名 | 用途 |
---|---|
java.lang.Class | 表明類的實體,在運行的Java應用程序中表示類和接口 |
java.lang.reflect.Field | 表明類的成員變量(成員變量也稱爲類的屬性) |
java.lang.reflect.Method | 表明類的方法 |
java.lang.reflect.Constructor | 表明類的構造方法 |
Class表明類的實體,在運行的Java應用程序中表示類和接口。在這個類中提供了不少有用的方法,這裏對他們簡單的分類介紹。數組
方法 | 用途 |
---|---|
asSubclass(Class<U> clazz) | 把傳遞的類的對象轉換成表明其子類的對象 |
Cast | 把對象轉換成表明類或是接口的對象 |
getClassLoader() | 得到類的加載器 |
getClasses() | 返回一個數組,數組中包含該類中全部公共類和接口類的對象 |
getDeclaredClasses() | 返回一個數組,數組中包含該類中全部類和接口類的對象 |
forName(String className) | 根據類名返回類的對象 |
getName() | 得到類的完整路徑名字 |
newInstance() | 建立類的實例 |
getPackage() | 得到類的包 |
getSimpleName() | 得到類的名字 |
getSuperclass() | 得到當前類繼承的父類的名字 |
getInterfaces() | 得到當前類實現的類或是接口 |
方法 | 用途 |
---|---|
getField(String name) | 得到某個公有的屬性對象 |
getFields() | 得到全部公有的屬性對象 |
getDeclaredField(String name) | 得到某個屬性對象 |
getDeclaredFields() | 得到全部屬性對象 |
方法 | 用途 |
---|---|
getAnnotation(Class<A> annotationClass) | 返回該類中與參數類型匹配的公有註解對象 |
getAnnotations() | 返回該類全部的公有註解對象 |
getDeclaredAnnotation(Class<A> annotationClass) | 返回該類中與參數類型匹配的全部註解對象 |
getDeclaredAnnotations() | 返回該類全部的註解對象 |
方法 | 用途 |
---|---|
getConstructor(Class...<?> parameterTypes) | 得到該類中與參數類型匹配的公有構造方法 |
getConstructors() | 得到該類的全部公有構造方法 |
getDeclaredConstructor(Class...<?> parameterTypes) | 得到該類中與參數類型匹配的構造方法 |
getDeclaredConstructors() | 得到該類全部構造方法 |
方法 | 用途 |
---|---|
getMethod(String name, Class...<?> parameterTypes) | 得到該類某個公有的方法 |
getMethods() | 得到該類全部公有的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 得到該類某個方法 |
getDeclaredMethods() | 得到該類全部方法 |
方法 | 用途 |
---|---|
isAnnotation() | 若是是註解類型則返回true |
isAnnotationPresent(Class<? extends Annotation> annotationClass) | 若是是指定類型註解類型則返回true |
isAnonymousClass() | 若是是匿名類則返回true |
isArray() | 若是是一個數組類則返回true |
isEnum() | 若是是枚舉類則返回true |
isInstance(Object obj) | 若是obj是該類的實例則返回true |
isInterface() | 若是是接口類則返回true |
isLocalClass() | 若是是局部類則返回true |
isMemberClass() | 若是是內部類則返回true |
Field表明類的成員變量(成員變量也稱爲類的屬性)框架
方法 | 用途 |
---|---|
equals(Object obj) | 屬性與obj相等則返回true |
get(Object obj) | 得到obj中對應的屬性值 |
set(Object obj, Object value) | 設置obj中對應屬性值 |
Method表明類的方法。對象
方法 | 用途 |
---|---|
invoke(Object obj, Object... args) | 傳遞object對象及參數調用該對象對應的方法 |
Constructor表明類的構造方法。繼承
方法 | 用途 |
---|---|
newInstance(Object... initargs) | 根據傳遞的參數建立類的對象 |
在閱讀Class類文檔時發現一個特色,以經過反射得到Method對象爲例,通常會提供四種方法,getMethod(parameterTypes)、getMethods()、getDeclaredMethod(parameterTypes)和getDeclaredMethods()。getMethod(parameterTypes)用來獲取某個公有的方法的對象,getMethods()得到該類全部公有的方法,getDeclaredMethod(parameterTypes)得到該類某個方法,getDeclaredMethods()得到該類全部方法。接口
帶有Declared修飾的方法能夠反射到私有的方法,沒有Declared修飾的只能用來反射公有的方法。 其餘的Annotation、Field、Constructor也是如此。開發
在ReflectClass類中還提供了兩種反射PowerManager.shutdown()的方法,在調用的時候會輸出以下log,提示沒有相關權限。以前在項目中嘗試反射其餘方法的時候還遇到過有權限和沒權限返回的值不同的狀況。文檔
若是源碼中明確進行了權限驗證,而你的應用又沒法得到這個權限的話,建議就不要浪費時間反射了。get