1. 程式人生 > >java常用工具類(一)—— Map 與 Bean 之間的互相轉換

java常用工具類(一)—— Map 與 Bean 之間的互相轉換

import net.bytebuddy.implementation.bytecode.Throw;
import org.springframework.cglib.beans.BeanMap;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;


/**
 * @author Lius
 * @date 2018/10/26 13:37
 * @describe 實體工具類,
 */
public class BeanUtils extends org.springframework.beans.BeanUtils {
    public BeanUtils() {
    }

    /**
     * 例項化物件:傳入類對類進行例項化物件
     *
     * @param clazz 類
     * @return 物件
     * @author Lius
     * @date 2018/10/26 13:49
     */
    public static <T> T newInstance(Class<?> clazz) {
        return (T) instantiateClass(clazz);
    }

    /**
     * 例項化物件,傳入類名對該類進行例項化物件
     *
     * @param clazzStr 類名,傳入是必須傳入全路徑,com...
     * @return 物件
     * @author Lius
     * @date 2018/10/26 13:54
     */
    public static <T> T newInstance(String clazzStr) {
        try {
            Class<?> clazz = Class.forName(clazzStr);
            return newInstance(clazz);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException();
        }
    }

    /**
     * 把物件封裝成Map形式
     *
     * @param src 需要封裝的實體物件
     * @author Lius
     * @date 2018/10/26 14:08
     */
    public static Map toMap(Object src) {
        return BeanMap.create(src);
    }

    /**
     * 把Map轉換成bean物件
     *
     * @author Lius
     * @date 2018/10/26 14:09
     */
    public static <T> T toBean(Map<String, Object> beanMap, Class<T> valueType) {
        // 物件例項化
        T bean = BeanUtils.newInstance(valueType);
        PropertyDescriptor[] propertyDescriptors = getPropertyDescriptors(valueType);
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            String properName = propertyDescriptor.getName();
            // 過濾class屬性
            if ("class".equals(properName)) {
                continue;
            }
            if (beanMap.containsKey(properName)) {
                Method writeMethod = propertyDescriptor.getWriteMethod();
                if (null == writeMethod) {
                    continue;
                }
                Object value = beanMap.get(properName);
                if (!writeMethod.isAccessible()) {
                    writeMethod.setAccessible(true);
                }
                try {
                    writeMethod.invoke(bean, value);
                } catch (Throwable throwable) {
                    throw new RuntimeException("Could not set property '" + properName + " ' to bean" + throwable);
                }
            }
        }
        return bean;
    }

    public static void main(String[] args) {
        // Map To Bean
        Map<String, Object> map = new HashMap<String, Object>(16);
        map.put("loginName", "loginName");
        map.put("name", "name");
        map.put("password", "password");
        map.put("salt", "salt");
        map.put("phone", "phone");
        User user = toBean(map, User.class);
        System.out.println(user.getLoginName());

        // Bean To Map
        User user1 = new User();
        Map userMap = toMap(user1);
        System.out.println(userMap);
    }

}