一:反射是什么
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠獲取這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取類信息以及動態調用對象內容就稱為java語言的反射機制。
二:反射的作用
-
在運行時判斷任意一個對象所屬的類;
-
在運行時構造任意一個類的對象;
-
在運行時判斷任意一個類所具有的成員變量和方法;
-
在運行時調用任意一個對象的方法;
三:反射的實現
我們知道,要使用一個類,就要先把它加載到虛擬機中,生成一個Class對象。這個class對象就保存了這個類的一切信息。
反射機制的實現,就是獲取這個Class對象,通過Class對象去訪問類、對象的元數據以及運行時的數據。
有三種方法獲得類的Class對象:Class.forName(String className)、className.class、實例對象.getClass();
四:反射涉及的API
反射首先獲取Class對象;然后獲取Method類和Field類;最后通過Method和Field類進行具體的方法調用或屬性訪問。
1:在運行時獲取對象所屬類的類名等信息
對象名.getClass().getName();
2:通過反射機制創建class對象(三種方法)
class1 = Class.forName(className);
class2 = 對象名.getClass(); class3 = 對象名.class;
3:在運行時,通過創建class對象,獲取自己的父類信息
Class<?> clazz = Class.forName(當前類);
Class<?> parentClass = clazz.getSuperclass(); parentClass.getName();//獲得父類名
4:通過反射機制創建一個類的對象
1:反射創建class對象(見上面)
2:Classname 對象=classname.newInstance(參數);
5:獲取類的全部方法,存於一個數組中
//創建class對象 Class<?> clazz = Class.forName(ClassName); // 返回聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。 Method[] getDeclaredMethods(); //返回可被訪問的公共方法 Method method[] = clazz.getMethods();
6:獲取類的全部字段,存於一個數組中
Class<?> clazz = Class.forName(classname); // 取得本類已聲明的所有字段,包括私有的、保護的 Field[] field = clazz.getDeclaredFields(); // 取得本類中可訪問的所有公共字段 Field[] filed1 = clazz.getFields();
7:操作類/對象 的某個屬性(包括私有)
Class<?> clazz = Class.forName(classname); //返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 包括公共、私有、保護的字段。 Field field = clazz.getDeclaredField(字段名); //禁用Java權限修飾符的作用,無視方法權限限制進行訪問 field.setAccessible(true); // void set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設置為指定的新值。 field.set(該類的一個對象, 字段值);
8:調用類/對象 的某個方法(包括私有)
Class<?> clazz = Class.forName(classname); // Method getMethod(String name, Class<?>... parameterTypes)
//返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
//獲取一個公有函數 Method method = clazz.getMethod(方法名,參數類型); //調用具體某個實例對象的這個公有方法 method.invoke(實例對象,參數值); // Method getDeclaredMethod(String name, Class<?>... parameterTypes) //返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 包括私有、保護、公有方法 //獲取一個私有函數 Method private_method=class.getDeclaredMethod(函數名,參數類型); //禁用Java權限限定符的作用,使私有函數可訪問 private_method.setAccessible(true); //調用具體實例對象的這個方法 private_method.invoke(實例對象,參數);
五:附錄
Class對象的方法列表
|
asSubclass(Class<U> clazz) 強制轉換該 Class 對象,以表示指定的 class 對象所表示的類的一個子類。 |
|
T |
cast(Object obj) 將一個對象強制轉換成此 Class 對象所表示的類或接口。 |
|
boolean |
desiredAssertionStatus() 如果要在調用此方法時將要初始化該類,則返回將分配給該類的斷言狀態。 |
|
static Class<?> |
forName(String className) 返回與帶有給定字符串名的類或接口相關聯的 Class 對象。 |
|
static Class<?> |
forName(String name, boolean initialize, ClassLoader loader) 使用給定的類加載器,返回與帶有給定字符串名的類或接口相關聯的 Class 對象。 |
|
|
getAnnotation(Class<A> annotationClass) 如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。 |
|
Annotation[] |
getAnnotations() 返回此元素上存在的所有注釋。 |
|
String |
getCanonicalName() 返回 Java Language Specification 中所定義的底層類的規范化名稱。 |
|
Class<?>[] |
getClasses() 返回一個包含某些 Class 對象的數組,這些對象表示屬於此 Class 對象所表示的類的成員的所有公共類和接口。 |
|
ClassLoader |
getClassLoader() 返回該類的類加載器。 |
|
Class<?> |
getComponentType() 返回表示數組組件類型的 Class。 |
|
Constructor<T> |
getConstructor(Class<?>... parameterTypes) 返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構造方法。 |
|
Constructor<?>[] |
getConstructors() 返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法。 |
|
Annotation[] |
getDeclaredAnnotations() 返回直接存在於此元素上的所有注釋。 |
|
Class<?>[] |
getDeclaredClasses() 返回 Class 對象的一個數組,這些對象反映聲明為此 Class 對象所表示的類的成員的所有類和接口。 |
|
Constructor<T> |
getDeclaredConstructor(Class<?>... parameterTypes) 返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法。 |
|
Constructor<?>[] |
getDeclaredConstructors() 返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。 |
|
Field |
getDeclaredField(String name) 返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 |
|
Field[] |
getDeclaredFields() 返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。 |
|
Method |
getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 |
|
Method[] |
getDeclaredMethods() 返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法。 |
|
Class<?> |
getDeclaringClass() 如果此 Class 對象所表示的類或接口是另一個類的成員,則返回的 Class 對象表示該對象的聲明類。 |
|
Class<?> |
getEnclosingClass() 返回底層類的立即封閉類。 |
|
Constructor<?> |
getEnclosingConstructor() 如果該 Class 對象表示構造方法中的一個本地或匿名類,則返回 Constructor 對象,它表示底層類的立即封閉構造方法。 |
|
Method |
getEnclosingMethod() 如果此 Class 對象表示某一方法中的一個本地或匿名類,則返回 Method 對象,它表示底層類的立即封閉方法。 |
|
T[] |
getEnumConstants() 如果此 Class 對象不表示枚舉類型,則返回枚舉類的元素或 null。 |
|
Field |
getField(String name) 返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段。 |
|
Field[] |
getFields() 返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或接口的所有可訪問公共字段。 |
|
Type[] |
getGenericInterfaces() 返回表示某些接口的 Type,這些接口由此對象所表示的類或接口直接實現。 |
|
Type |
getGenericSuperclass() 返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type。 |
|
Class<?>[] |
getInterfaces() 確定此對象所表示的類或接口實現的接口。 |
|
Method |
getMethod(String name, Class<?>... parameterTypes) 返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。 |
|
Method[] |
getMethods() 返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 |
|
int |
getModifiers() 返回此類或接口以整數編碼的 Java 語言修飾符。 |
|
String |
getName() 以 String 的形式返回此 Class 對象所表示的實體(類、接口、數組類、基本類型或 void)名稱。 |
|
Package |
getPackage() 獲取此類的包。 |
|
ProtectionDomain |
getProtectionDomain() 返回該類的 ProtectionDomain。 |
|
URL |
getResource(String name) 查找帶有給定名稱的資源。 |
|
InputStream |
getResourceAsStream(String name) 查找具有給定名稱的資源。 |
|
Object[] |
getSigners() 獲取此類的標記。 |
|
String |
getSimpleName() 返回源代碼中給出的底層類的簡稱。 |
|
Class<? super T> |
getSuperclass() 返回表示此 Class 所表示的實體(類、接口、基本類型或 void)的超類的 Class。 |
|
TypeVariable<Class<T>>[] |
getTypeParameters() 按聲明順序返回 TypeVariable 對象的一個數組,這些對象表示用此 GenericDeclaration 對象所表示的常規聲明來聲明的類型變量。 |
|
boolean |
isAnnotation() 如果此 Class 對象表示一個注釋類型則返回 true。 |
|
boolean |
isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定類型的注釋存在於此元素上,則返回 true,否則返回 false。 |
|
boolean |
isAnonymousClass() 當且僅當底層類是匿名類時返回 true。 |
|
boolean |
isArray() 判定此 Class 對象是否表示一個數組類。 |
|
boolean |
isAssignableFrom(Class<?> cls) 判定此 Class 對象所表示的類或接口與指定的 Class 參數所表示的類或接口是否相同,或是否是其超類或超接口。 |
|
boolean |
isEnum() 當且僅當該類聲明為源代碼中的枚舉時返回 true。 |
|
boolean |
isInstance(Object obj) 判定指定的 Object 是否與此 Class 所表示的對象賦值兼容。 |
|
boolean |
isInterface() 判定指定的 Class 對象是否表示一個接口類型。 |
|
boolean |
isLocalClass() 當且僅當底層類是本地類時返回 true。 |
|
boolean |
isMemberClass() 當且僅當底層類是成員類時返回 true。 |
|
boolean |
isPrimitive() 判定指定的 Class 對象是否表示一個基本類型。 |
|
boolean |
isSynthetic() 如果此類是復合類,則返回 true,否則 false。 |
|
T |
newInstance() 創建此 Class 對象所表示的類的一個新實例。 |
|
String |
toString() 將對象轉換為字符串。 |
Field對象方法列表
boolean |
equals(Object obj) 將此 Field 與指定對象比較。 |
|
Object |
get(Object obj) 返回指定對象上此 Field 表示的字段的值。 |
|
|
getAnnotation(Class<T> annotationClass) 如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。 |
|
boolean |
getBoolean(Object obj) 獲取一個靜態或實例 boolean 字段的值。 |
|
byte |
getByte(Object obj) 獲取一個靜態或實例 byte 字段的值。 |
|
char |
getChar(Object obj) 獲取 char 類型或另一個通過擴展轉換可以轉換為 char 類型的基本類型的靜態或實例字段的值。 |
|
Annotation[] |
getDeclaredAnnotations() 返回直接存在於此元素上的所有注釋。 |
|
Class<?> |
getDeclaringClass() 返回表示類或接口的 Class 對象,該類或接口聲明由此 Field 對象表示的字段。 |
|
double |
getDouble(Object obj) 獲取 double 類型或另一個通過擴展轉換可以轉換為 double 類型的基本類型的靜態或實例字段的值。 |
|
float |
getFloat(Object obj) 獲取 float 類型或另一個通過擴展轉換可以轉換為 float 類型的基本類型的靜態或實例字段的值。 |
|
Type |
getGenericType() 返回一個 Type 對象,它表示此 Field 對象所表示字段的聲明類型。 |
|
int |
getInt(Object obj) 獲取 int 類型或另一個通過擴展轉換可以轉換為 int 類型的基本類型的靜態或實例字段的值。 |
|
long |
getLong(Object obj) 獲取 long 類型或另一個通過擴展轉換可以轉換為 long 類型的基本類型的靜態或實例字段的值。 |
|
int |
getModifiers() 以整數形式返回由此 Field 對象表示的字段的 Java 語言修飾符。 |
|
String |
getName() 返回此 Field 對象表示的字段的名稱。 |
|
short |
getShort(Object obj) 獲取 short 類型或另一個通過擴展轉換可以轉換為 short 類型的基本類型的靜態或實例字段的值。 |
|
Class<?> |
getType() 返回一個 Class 對象,它標識了此 Field 對象所表示字段的聲明類型。 |
|
int |
hashCode() 返回該 Field 的哈希碼。 |
|
boolean |
isEnumConstant() 如果此字段表示枚舉類型的元素,則返回 true;否則返回 false。 |
|
boolean |
isSynthetic() 如果此字段是復合字段,則返回 true;否則返回 false。 |
|
void |
set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設置為指定的新值。 |
|
void |
setBoolean(Object obj, boolean z) 將字段的值設置為指定對象上的一個 boolean 值。 |
|
void |
setByte(Object obj, byte b) 將字段的值設置為指定對象上的一個 byte 值。 |
|
void |
setChar(Object obj, char c) 將字段的值設置為指定對象上的一個 char 值。 |
|
void |
setDouble(Object obj, double d) 將字段的值設置為指定對象上的一個 double 值。 |
|
void |
setFloat(Object obj, float f) 將字段的值設置為指定對象上的一個 float 值。 |
|
void |
setInt(Object obj, int i) 將字段的值設置為指定對象上的一個 int 值。 |
|
void |
setLong(Object obj, long l) 將字段的值設置為指定對象上的一個 long 值。 |
|
void |
setShort(Object obj, short s) 將字段的值設置為指定對象上的一個 short 值。 |
|
String |
toGenericString() 返回一個描述此 Field(包括其一般類型)的字符串。 |
|
String |
toString() 返回一個描述此 Field 的字符串。 |
Method對象方法列表
boolean |
equals(Object obj) 將此 Method 與指定對象進行比較。 |
|
|
getAnnotation(Class<T> annotationClass) 如果存在該元素的指定類型的注釋,則返回這些注釋,否則返回 null。 |
|
Annotation[] |
getDeclaredAnnotations() 返回直接存在於此元素上的所有注釋。 |
|
Class<?> |
getDeclaringClass() 返回表示聲明由此 Method 對象表示的方法的類或接口的 Class 對象。 |
|
Object |
getDefaultValue() 返回由此 Method 實例表示的注釋成員的默認值。 |
|
Class<?>[] |
getExceptionTypes() 返回 Class 對象的數組,這些對象描述了聲明將此 Method 對象表示的底層方法拋出的異常類型。 |
|
Type[] |
getGenericExceptionTypes() 返回 Type 對象數組,這些對象描述了聲明由此 Method 對象拋出的異常。 |
|
Type[] |
getGenericParameterTypes() 按照聲明順序返回 Type 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型的。 |
|
Type |
getGenericReturnType() 返回表示由此 Method 對象所表示方法的正式返回類型的 Type 對象。 |
|
int |
getModifiers() 以整數形式返回此 Method 對象所表示方法的 Java 語言修飾符。 |
|
String |
getName() 以 String 形式返回此 Method 對象表示的方法名稱。 |
|
Annotation[][] |
getParameterAnnotations() 返回表示按照聲明順序對此 Method 對象所表示方法的形參進行注釋的那個數組的數組。 |
|
Class<?>[] |
getParameterTypes() 按照聲明順序返回 Class 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型。 |
|
Class<?> |
getReturnType() 返回一個 Class 對象,該對象描述了此 Method 對象所表示的方法的正式返回類型。 |
|
TypeVariable<Method>[] |
getTypeParameters() 返回 TypeVariable 對象的數組,這些對象描述了由 GenericDeclaration 對象表示的一般聲明按聲明順序來聲明的類型變量。 |
|
int |
hashCode() 返回此 Method 的哈希碼。 |
|
Object |
invoke(Object obj, Object... args) 對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。 |
|
boolean |
isBridge() 如果此方法是 bridge 方法,則返回 true;否則,返回 false。 |
|
boolean |
isSynthetic() 如果此方法為復合方法,則返回 true;否則,返回 false。 |
|
boolean |
isVarArgs() 如果將此方法聲明為帶有可變數量的參數,則返回 true;否則,返回 false。 |
|
String |
toGenericString() 返回描述此 Method 的字符串,包括類型參數。 |
|
String |
toString() 返回描述此 Method 的字符串。 |
