Object to Map 转换的三种方法
就是把对象以及其对应的属性名 和属性值, 映射到一个Map中
- import java.beans.BeanInfo;
- import java.beans.IntrospectionException;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.HashMap;
- import java.util.Map;
- /**
- * User: pengfei.hpf
- * Date: 14-5-8
- * Time: 下午12:34
- */
- public class ObjectToMap {
- public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
- TestObject o = new TestObject();
- o.setCity("beijing");
- o.setName("bj");
- o.setOrder("ASC");
- ObjectToMap objectToMap = new ObjectToMap();
- System.out.println("=========== Invoke objectToMapViaBeanInfo ===========");
- objectToMap.objectToMapViaBeanInfo(o);
- System.out.println("=========== Invoke objectToMapViaFields ===========");
- objectToMap.objectToMapViaFields(o);
- System.out.println("=========== Invoke objectToMapViaApacheTools ===========");
- objectToMapViaApacheTools(o);
- }
- /**
- * 通过Introspector 的方式复制属性值
- * */
- private static void objectToMapViaBeanInfo(TestObject o) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
- Map<String, Object> result = new HashMap<String, Object>();
- BeanInfo info = Introspector.getBeanInfo(o.getClass());
- for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
- Method reader = pd.getReadMethod();
- //内容为null的过滤掉
- if (reader == null || reader.invoke(o) == null) {
- continue;
- }
- //默认继承Object类的属性,过滤掉
- if (pd.getName().equalsIgnoreCase("class")) {
- continue;
- }
- result.put(pd.getName(), reader.invoke(o));
- }
- for (String key : result.keySet()) {
- System.out.println("Key:" + key + ";Value:" + result.get(key));
- }
- }
- /**
- * 通过getDeclaredFields 的方式复制属性值
- * getDeclaredFields方式不会返回父类的属性
- * */
- private static void objectToMapViaFields(TestObject o) throws IllegalAccessException {
- Map<String, Object> resMap = new HashMap<String, Object>();
- Field[] declaredFields = o.getClass().getDeclaredFields();
- for (Field field : declaredFields) {
- field.setAccessible(true);
- //过滤内容为空的
- if (field.get(o) == null) {
- continue;
- }
- resMap.put(field.getName(), field.get(o));
- }
- printOut(resMap);
- }
- /**
- * 通过Apache beanUtils的方式复制属性值
- * 其内部实现方式同 方法1
- * */
- private static void objectToMapViaApacheTools(TestObject o) {
- Map<String, Object> resMap = new org.apache.commons.beanutils.BeanMap(o);
- printOut(resMap);
- }
- /**
- * 打印结果
- * */
- private static void printOut(Map<String, Object> resMap) {
- for (String key : resMap.keySet()) {
- System.out.println("Key:" + key + ";Value:" + resMap.get(key));
- }
- }
- /**
- * 测试类
- * */
- public static class TestObject {
- String city;
- String name;
- String order;
- public String getOrder() {
- return order;
- }
- public void setOrder(String order) {
- this.order = order; }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getCity() {
- return city;
- }
- public void setCity(String city) {
- this.city = city;
- }
- }
- }