初映像:根据类名就可以实例化该类,支持动态调用。
Reflection是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过ReflectionAPIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.LinkedHashMap;
import java.util.Map;
public class Map2BeanDemo {
public static void main(String[] args){
//把bean 转成map,实现BeanUtils.populate的逆过程
Map<String,Object> map = new LinkedHashMap<String,Object>();
Calendar ccBday = new GregorianCalendar(2012,11,09);
Person cc = new Person(“cc",25,ccBday.getTime());
map = transBean2Map(cc);
System.out.println("***** print map ********");
for(Map.Entry<String, Object> entry: map.entrySet()){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
public static Map<String,Object> transBean2Map(Object obj){
Map<String,Object> map = new LinkedHashMap<String,Object>();
//key值 应该是 Person类中的属性名,利用反射机制
Field[] fields = obj.getClass().getDeclaredFields();
for(int i=0; i<fields.length; i++){
String field = fields[i].toString();
String[] keys = field.split("\\.");
String key = keys[keys.length-1];
char toUpperCase = (char)(key.charAt(0)-32);
String keyUpper = key.replace(key.charAt(0),toUpperCase);
Method getMethod;
try {
getMethod = obj.getClass().getDeclaredMethod("get"+keyUpper);//根据 field得到对应的get方法
Object value = getMethod.invoke(obj);
map.put(key, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return map;
}
}