能够分析类能力的程序成为反射,反射机制可以用来:
- 在运行时分析类的能力
- 在运行时检查对象
- 实现泛型数组操作代码
- 利用Method对象
在程序运行期间,Java运行时系统始终为所有对象维护一个运行时类型标识。这个信息会跟踪每个对象所属的类。虚拟机利用运行时类型信息选择要执行的正确的方法。可以使用一个特殊的Java类访问这些信息。保存这些信息的类型为Class,Object类中的getClass()方法将会返回一个Class类型的实例。
获取Class对象的三种方法:
- .getClass()
Employee e; ... Class cl = e.getClass(); String name = cl.getName(); //getName() 返回类的名字
- Class.forName() 使用静态方法获得类名对应的Class对象
String className = "java.lang.Double"; Class cl = Class.forName(className);
- 若T是任意的Java类型(或void关键字),T.class将代表匹配的类对象
Class cl1 = Random.class; Class cl2 = int.class;
虚拟机为每个类型管理一个唯一的Class对象,因此可以用==运算符实现对两个类的比较,例如
if(e.getClass() == Employee.class)...
若e是Employee的一个实例,返回true,但若是某个子类则是false。
2.Field、Method、Constructorjava.lang.reflect包中有Field、Method、Constructor三个类,分别用于描述类的字段,方法及构造器,这三个类都有getName()方法,用于返回对应的名称。Modifier.toString(XX.getModifiers())方法用于返回使用的修饰符。(若不用toString则返回一个整数)
2.1 Field类用于获取类中字段的信息
//@Param cl a Class Field[] fields1 = cl.getDeclaredFields();//返回所有出现在类声明中的字段,不包括超类的公共成员 Field[] fields2 = cl.getFields();//返回这个类支持的公共字段,包括超类的公共成员 Field field1 = cl.getField(String name);//根据name或者Field对象 Field field2 = cl.getDeclaredField(String name); Object get (Object obj); //返回obj对象中用这个Field对象描述的字段的值 void set(Object obj,Object newValue); //将obj对象中这个Field对象描述的字段设置成一个新值2.2 Method类
用于获取类中方法信息
//@Param cl a class Method[] methods1 = cl.getMethods();//返回所有公共方法,包括从超类中继承的方法 Method[] methods2 = cl.getDeclaredMethods();//只返回这个类或接口的全部方法,不包括继承来的方法 Method method1 = cl.getMethod(String name, Class>... parameterTypes); Method method2 = cl.getDeclaredMethod(String name, Class>... parameterTypes); //通过方法名及参数类型返回method public Object invoke(Object obj, Object... args); //调用包装在当前Method对象中的方法,第一个参数是隐式参数,其余的对象提供了显示参数,对于静态方法 //第一个参数可以忽略,若返回类型是基本类型,invoke会返回其包装器类型2.3 Constructor类 3. 其他内容 3.1 借助反射机制将dto转成map
public static Map dtoToMap(Object obj){
Map map = new HashMap();
Class cla = obj.getClass();
do{
Field[] fields = cla.getDeclaredFields();
for(Field field:fields){
String name = field.getName();
try {
Method method = cla.getMethod("get"+initCap(name),null);
map.put(name,method.invoke(obj,null));
}
catch (Exception e){
}
}
cla = cla.getSuperclass();
}while(cla != Object.class);
return map;
}
private static String initCap(String name) {
name = name.toLowerCase();
String str = name.substring(0,1);
str = str.toUpperCase();
String newStr = str+name.substring(1);
return newStr;
}



