两种方法
第一,根据方法名截取到属性名,然后通过invoke方法得到属性值
package ch5;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ch2.Student;
/**
* javaBean与Map的转换
* @author szw
*
*/
public class Demo1 {
/*
* 获取所有的方法,包括private、public、protect,和从其他类继承来的
*/
public static List<Method> getAllMethod(Object obj){
List<Method> methods = new ArrayList<Method>();
Class<?> clazz = obj.getClass();
while(!clazz.getName().equals("java.lang.Object")){
methods.addAll(Arrays.asList(clazz.getDeclaredMethods()));
clazz = clazz.getSuperclass();
}
return methods;
}
//根据方法名截取到属性名,然后通过invoke方法得到属性值
public static Map<String,Object> convertMap(Object obj){
List<Method> methods = getAllMethod(obj);
Map<String,Object> maplist = new HashMap<String,Object>();
for(Method m:methods){
String methodName = m.getName();
if(methodName.startsWith("get")){
String propertyName = methodName.substring(3,4).toLowerCase() + methodName.substring(4);
try {
maplist.put(propertyName, m.invoke(obj));
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return maplist;
}
public static void main(String[] args) {
// System.out.println(getAllMethod(new User()));
System.out.println(convertMap(new User()));
Map<String,Object> maplist = convertMap(new User());
for(Map.Entry<String,Object> en:maplist.entrySet()){
System.out.println(en.getKey()+" "+en.getValue());
}
}
}
第二,获取所有的属性名,通过属性名的get(obj)方法得到属性值
package ch5;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
*
* getFields()与getDeclaredFields()区别:
* getFields()只能访问类中声明为公有的字段,
* 私有的字段它无法访问,能访问从其它类继承来的公有方法.
* getDeclaredFields()能访问类中所有的字段,
* 与public,private,protect无关,不能访问从其它类继承来的方法
* getMethods()与getDeclaredMethods()区别:
* getMethods()只能访问类中声明为公有的方法,
* 私有的方法它无法访问,能访问从其它类继承来的公有方法.
* getDeclaredMethods()能访问类中所有的字段,
* 与public,private,protect无关,不能访问从其它类继承来的方法
* getConstructors()与getDeclaredConstructors()区别:
* getConstructors()只能访问类中声明为public的构造函数
* getDeclaredConstructors()能访问类中所有的构造函数,
* 与public,private,protect无关
* @author szw
*
*/
public class ObjectToMap {
public static Map<String,Object> toMap(Object obj){
Map<String,Object> maplist = new HashMap<String,Object>();
Field[] fs = obj.getClass().getDeclaredFields();
for(Field f:fs){
f.setAccessible(true);
try {
maplist.put(f.getName(),f.get(obj));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return maplist;
}
public static void main(String[] args) {
System.out.println(toMap(new User()));
}
}