两种方法
第一,根据方法名截取到属性名,然后通过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 blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return maplist;}public static void main(String[] args) {System.out.println(toMap(new User()));}
}