反射是爲了提高程序的靈活性,對Java類結構探知的能力。
一篇詳細介紹反射的文章:http://www.cyqdata.com/android/article-detail-36281
獲取構造方法:
/**
* 獲取反射類中的構造方法
* 輸出打印格式:"Modifier修飾域 構造方法名(參數類型列表)"
*
* Constructor getConstructor(Class[] params) 根據構造函數的參數,返回一個具體的具有public屬性的構造函數
Constructor getConstructors() 返回所有具有public屬性的構造函數數組
Constructor getDeclaredConstructor(Class[] params) 根據構造函數的參數,返回一個具體的構造函數(不分public和非public屬性)
Constructor getDeclaredConstructors() 返回該類中所有的構造函數數組(不分public和非public屬性)
*/
public static void get_Reflection_Constructors(ReflectionTest r) {
Class temp = r.getClass();
String className = temp.getName(); // 獲取指定類的類名
try {
Constructor[] theConstructors = temp.getDeclaredConstructors(); // 獲取指定類的公有構造方法
for (int i = 0; i < theConstructors.length; i++) {
int mod = theConstructors[i].getModifiers(); // 輸出修飾域和方法名稱
System.out.print(Modifier.toString(mod) + " " + className + "(");
Class[] parameterTypes = theConstructors[i].getParameterTypes(); // 獲取指定構造方法的參數的集合
for (int j = 0; j < parameterTypes.length; j++) { // 輸出打印參數列表
System.out.print(parameterTypes[j].getName());
if (parameterTypes.length > j+1) {
System.out.print(", ");
}
}
System.out.println(")");
}
} catch (Exception e) {
e.printStackTrace();
}
}
獲取類的成員方法:
/**
* 獲取反射類的方法
* 打印輸出格式:"RetType FuncName(paramTypeList)"
*
* Method getMethod(String name, Class[] params) 根據方法名和參數,返回一個具體的具有public屬性的方法
Method[] getMethods() 返回所有具有public屬性的方法數組
Method getDeclaredMethod(String name, Class[] params) 根據方法名和參數,返回一個具體的方法(不分public和非public屬性)
Method[] getDeclaredMethods() 返回該類中的所有的方法數組(不分public和非public屬性)
*/
public static void get_Reflection_Method(ReflectionTest r) {
Class temp = r.getClass();
String className = temp.getName();
/*
* Note: 方法getDeclaredMethods()只能獲取到由當前類定義的所有方法,不能獲取從父類繼承的方法
* 方法getMethods() 不僅能獲取到當前類定義的public方法,也能得到從父類繼承和已經實現接口的public方法
* 請查閱開發文檔對這兩個方法的詳細描述。
*/
//Method[] methods = temp.getDeclaredMethods();
Method[] methods = temp.getMethods();
for (int i = 0; i < methods.length; i++) {
// 打印輸出方法的修飾域
int mod = methods[i].getModifiers();
System.out.print(Modifier.toString(mod) + " ");
// 輸出方法的返回類型
System.out.print(methods[i].getReturnType().getName());
// 獲取輸出的方法名
System.out.print(" " + methods[i].getName() + "(");
// 打印輸出方法的參數列表
Class[] parameterTypes = methods[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
System.out.print(parameterTypes[j].getName());
if (parameterTypes.length > j+1) {
System.out.print(", ");
}
}
System.out.println(")");
}
}
獲取類的成員變量:
/**
* 獲取反射類中的屬性和屬性值
* 輸出打印格式:"Modifier Type : Name = Value"
* Note: 對於未初始化的指針類型的屬性,將不輸出結果
*
* Field getField(String name) 根據變量名,返回一個具體的具有public屬性的成員變量
Field[] getFields() 返回具有public屬性的成員變量的數組
Field getDeclaredField(String name) 根據變量名,返回一個成員變量(不分public和非public屬性)
Field[] getDelcaredField() 返回所有成員變量組成的數組(不分public和非public屬性)
*/
public static void get_Reflection_Field_Value(ReflectionTest r) {
Class temp = r.getClass(); // 獲取Class類的對象的方法之一
try {
Field[] fa = temp.getDeclaredFields();
for (int i = 0; i < fa.length; i++) {
Class cl = fa[i].getType(); // 屬性的類型
int md = fa[i].getModifiers(); // 屬性的修飾域
Field f = temp.getDeclaredField(fa[i].getName()); // f = fa[i]
f.setAccessible(true); // 設置是否可訪問
Object value = (Object) f.get(r);
if (value == null) {
System.out.println(Modifier.toString(md) + " " + cl + " : " + fa[i].getName());
}
else {
System.out.println(Modifier.toString(md) + " " + cl + " : " + fa[i].getName() + " = " + value.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}