Map与Bean的互相转换

实例类:

package wsy.bean2map;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class Person {
    private String name;

    private int age;

    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

实现与测试

package wsy.bean2map;
import org.apache.commons.beanutils.BeanUtils;
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.util.HashMap;
import java.util.Map;

public class Bean2Map {
    /**
     * 反射实现转换
     * @param obj
     * @return
     */
    public static Map<String, Object> bean2MapByReflect(Object obj)
        throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Map<String, Object> map = new HashMap<>();
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            map.put(field.getName(), obj.getClass().getDeclaredMethod(methodName).invoke(obj));
        }
        return map;
    }

    /**
     *
     * @param obj
     * @return
     */
    public static Map<String, Object> bean2Map(Object obj)
        throws IntrospectionException, InvocationTargetException, IllegalAccessException {
        Map<String, Object> map = new HashMap<>();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(), Object.class);
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor p : propertyDescriptors) {
            String key = p.getName();
            Object value = p.getReadMethod().invoke(obj);
            map.put(key, value);
        }
        return map;
    }

    /**
     *
     * @param map
     * @param classType
     * @param <T>
     */
    public static <T> T map2Bean(Map<String, Object> map, Class<T> classType)
        throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
        // 创建对象
        T obj = classType.newInstance();
        // 获取对象的字节码信息
        BeanInfo beanInfo = Introspector.getBeanInfo(classType, Object.class);
        // 获取bean对象中的所有属性
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor P : propertyDescriptors) {
            String key = P.getName();
            Object value = map.get(key);
            P.getWriteMethod().invoke(obj, value); // 设置属性值

        }
        return obj;
    }

    /**
     *  反射实现map转bean
     * @param map
     * @param classType
     * @param <T>
     * @return
     */
    public static <T> T map2BeanByReflect(Map<String, Object> map, Class<T> classType)
        throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        T obj = classType.newInstance();
        Field[] declaredFields = classType.getDeclaredFields();
        for (Field field : declaredFields) {
            Object value = map.get(field.getName());
            String methodName = "set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
            classType.getDeclaredMethod(methodName, field.getType()).invoke(obj, value);
        }
        return obj;
    }

    public static void main(String[] args)
        throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IntrospectionException,
               InstantiationException {
        Person person = new Person("jack", 18);
        System.out.println(bean2Map(person));
        System.out.println(bean2MapByReflect(person));
        System.out.println("======================");

        Map<String, Object> map = new HashMap<>();
        map.put("name", "Tom");
        map.put("age", 18);
        System.out.println(map2Bean(map, Person.class).toString());
        System.out.println(map2BeanByReflect(map, Person.class));
        System.out.println("========================");

        // 引入apache封装的BeanUtils
        // bean转map
        Map<String, String> describe = BeanUtils.describe(person);
        System.out.println(describe);

        // map 转bean
        Person person1 = new Person();
        BeanUtils.copyProperties(person1, map);
        System.out.println(person1);

    }
}

测试结果

{name=jack, age=18}
{name=jack, age=18}
======================
Person(name=Tom, age=18)
Person(name=Tom, age=18)
========================
{name=jack, age=18}
Person(name=Tom, age=18)

BeanUtils依赖:

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

依赖参考:
http://commons.apache.org/beanutils/ 
注意:应用的时候还需要一个logging包 http://commons.apache.org/logging/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值