反射是为了提高程序的灵活性,对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();
}
}