Java 反射

2016/01/01 Java

所谓 JAVA 反射就是在运行状态中,对于任意一个实体类,都能够反向获取这个类的所有属性和方法。

Class 对象

任何一个类都是Class类的实例,都有三种获取方式。

F f = new F();
Class f1 = F.class;
Class f2 = f.getClass();
Class f3 = Class.forName(com.albert.F); // 动态加载类
// 其实f1 == f2 ==f3
Class c1 = int.class; // int类型的class
Class c2 = Integer.class; // Integer类的class

Class 创建对象

F f = (F)f1.newInstance(); // 必须有无参数的构造方法 强制类型转换

动态加载,配合多态(实现接口,然后Class 接口 = (接口)Class.forName(类名)),程序升级,只需要编译新的文件。

获取 Class 中信息

类的名称 c.getName(); 类的所有public成员方法(包括继承的) Method[] ms = c.getMethods(); 类自己声明的方法 Method[] ms = c.getDeclaredMethods(); 得到方法的返回值类型 Class returnType = ms[1].getReturnType(); 得到方法的名称 ms[1].getName(); 得到参数的类型 Class[] paramTypes = ms[1].getParameterTypes();

成员变量也是对象 java.lang.reflect.Field 得到成员变量信息 Field[] fs = c.getFields(); 得到所有自己声明的成员变量信息 Field[] fs = c.getDeclaredFields(); 成员变量的类型的class Class fieldType = fs[0].getType(); 成员变量的名称 String fieldName = fieldType.getName();

获取构造函数 java.lang.Constructor 所有public的构造方法 Constructor[] con = c.getConstructors(); 自己声明的构造方法 Constructor[] con = c.getDeclaredConstructors(); 构造函数参数类型 Class[] paramTypes = con[0].getParameterTypes();

方法的反射操作 method.invoke(对象,参数列表) 获取特定的public的方法

Method m = c.getMethod(方法名,参数列表); 
// c.getMethod("print", new Class[]{int.class,int.class})
// c.getMethod("print", int.class, int.class);

调用得到返回值 Object o = m.invoke(obj, new Object[]{1,1});m.invoke(obj, 1,1);

集合的泛型 List<T> list = new List<T>; 只在编译阶段验证添加的类型,如果用Method.invoke()反射就可绕过。

foreach循环可用于数组或集合

Search

    Table of Contents