java反射学习笔记
2016-09-07 本文已影响27人
liut_2016
java中一切皆对象,也就是说 类,方法,变量 他们本身也是对象.
类是java.lang.Class类的对象,称类的类类型
成员变量是java.lang.reflect.Field对象
成员方法是java.lang.reflect.Method对象
知识结构

- 通过反射获取类的成员变量,构造器,方法并打印.
//用以测试的类
class A {
public int a;
public String b;
public A() {}
public A(int a) {}
public A(int a, String b) {}
public void m1() {}
public String m2(int a) {
return "I am Method m2 !" + a;
}
}
代码
package xyz.liut.classdemo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Created by liut on 16-9-6.
* Class 测试,分析类的成员变量,方法,构造器
*/
public class ClassUtil {
public static void main(String... args) {
ClassUtil.printClassInfo(new A());
}
public static void printClassInfo(Object obj) {
//c为obj的类类型
Class c = obj.getClass();
System.out.println("类的名字:" + c.getName());
printClassFieldMessage(obj);
printClassConstructorMesage(obj);
printClassMethodMessage(obj);
}
/**
* 获取类的成员变量
* getFields() 所有public变量 包括继承的
* getDeclaredFields() 所有自己定义的变量,所有访问权限
*/
public static void printClassFieldMessage(Object obj) {
Class c = obj.getClass();
System.out.println("成员变量列表");
Field[] fs = c.getDeclaredFields();
for (Field f : fs) {
Class fieldType = f.getType();
String fieldName = f.getName();
System.out.println(fieldType.getSimpleName() + " " + fieldName + ";");
}
}
/**
* 获取类的构造方法
* getConstructors() 获取所有public构造器
* getDeclaredConstructors() 获取所有的构造器
*/
public static void printClassConstructorMesage(Object obj) {
System.out.println("构造方法列表");
Class c = obj.getClass();
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
String constructorName = constructor.getName();
System.out.print(constructorName + " (");
Class[] constructorParamTypes = constructor.getParameterTypes();
for (Class constructorParamType : constructorParamTypes) {
System.out.print(constructorParamType.getSimpleName() + ",");
}
System.out.println(")");
}
}
/**
* 获取类的成员方法
* getMethods() 获取所有public方法,包括继承而来的
* getDeclaredMethods() 获取所有自定义方法,无论访问权限
*/
public static void printClassMethodMessage(Object obj) {
Class c = obj.getClass();
System.out.println("方法列表");
Method[] ms = c.getDeclaredMethods();
for (Method m : ms) {
//返回值类型的类类型
Class returnType = m.getReturnType();
//方法名
String methodName = m.getName();
System.out.print(returnType.getSimpleName() + " " + methodName + "(");
//参数列表的类类型
for (Class paramType : m.getParameterTypes()) {
System.out.print(paramType.getName() + ",");
}
System.out.println(")");
}
}
}
执行结果
类的名字:xyz.liut.classdemo.A
成员变量列表
int a;
String b;
构造方法列表
xyz.liut.classdemo.A ()
xyz.liut.classdemo.A (int,String,)
xyz.liut.classdemo.A (int,)
方法列表
void m1()
String m2(int,)
- 通过反射获取指定方法并执行.
package xyz.liut.classdemo;
import java.lang.reflect.Method;
/**
* Created by liut on 16-9-7.
*/
public class MethodUtil {
public static void main(String... args) {
invoke(new A(), "m2");
}
/**
* 通过反射 执行对应对象的对应方法.
* c.getMethod() 获取指定方法,传入方法名,参数类型的可变数组 public 权限 包括继承
* c.getDeclaredMethod() 所有自己声明的方法
*
* @param obj 任意对象
* @param methodName 对应方法名
*/
public static void invoke(Object obj, String methodName) {
Class c = obj.getClass();
Method m = null;
try {
m = c.getMethod(methodName, int.class);
//若方法有返回值,即o,若无则o==null;
Object o = m.invoke(obj, 1);
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果为
I am Method m2 !1