程序员的知识教程库

网站首页 > 教程分享 正文

ObjectConverterUtil,别再像个二货一样一直get/set了

henian88 2024-09-02 16:38:37 教程分享 4 ℃ 0 评论

平时写代码的过程中会碰到将一个JavaBean对象的属性,复制到另一个JavaBean对象;或者将一个JavaBean对象的属性和值转成Map。如果JavaBean的属性比较多,会大量调用getter、setter方法,耗费时间写重复的代码。如:

dto.setId(item.getId);
dto.setPrice(item.getPrice);
dto.setMaxPrice(item.getMaxPrice);
dto.setPcDesc(item.getPcDesc);
dto.setMobileDesc(item.getMobileDesc);

利用 ObjectConverterUtil类可以自动调用getter、setter方法,根据熟悉和属性名进行属性值的复制,或者转换成Map<String, Object>的Map对象。如:

/*
 * 将一个JavaBean对象的属性,复制到另一个JavaBean对象
 * objectCopy(T targetObject, Object sourceObject)
 */
ObjectConvertUtil.objectCopy(dto,item);
 
/*
 * 将一个JavaBean对象的属性和值转成Map
 */
Map<String,Object> objMap = ObjectConvertUtil.objectToMap(dto)

ObjectConverterUtil 代码如下:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
 
/**
 * ObjectA to ObjectB 简单复制(不支持继承属性复制)
 */
public class ObjectConvertUtil {
 
    /**
     * 把map 转换成对象
     * map.key==>object.field;map.value==>object.field.value
     * (包含继承属性)
     *
     * @param map 类属性值
     * @param cls clazz
     * @return <T>
     */
    public static <T> T mapToObject(Map<String, Object> map, Class<T> cls) {
        return mapToObject(map, cls, true);
    }
 
    /**
     * 把map 转换成对象
     * map.key==>object.field;map.value==>object.field.value
     *
     * @param map       类属性值
     * @param cls       clazz
     * @param isInherit 是否赋值继承自父类的属性
     * @return <T>
     */
    public static <T> T mapToObject(Map<String, Object> map, Class<T> cls, boolean isInherit) {
        if (map == null || map.isEmpty()) return null;
 
        Field[] fields = cls.getDeclaredFields();
        T obj;
        try {
            obj = cls.newInstance();
            for (Field field : fields) {
                field.setAccessible(true);
                Class<?> clsType = field.getType();
                String name = field.getName();
                String strSet = "set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
                Method methodSet = cls.getDeclaredMethod(strSet, clsType);
                if (map.containsKey(name)) {
                    methodSet.invoke(obj, map.get(name));
                }
            }
            //把继承直接父类的属性也赋值
            if (isInherit) obj = getGenericSuperclassFields(map, obj);
            return obj;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    /**
     * 把对象的属性及属性的值轮换为map的key=value形式(不包含继承属性)
     *
     * @param obj 目标对象
     * @return Map
     */
    public static Map<String, Object> objectToMap(Object obj) {
        return objectToMapExcludeNullVal(obj, false);
    }
 
    /**
     * 把对象的属性及属性的值轮换为map的key=value形式
     *
     * @param obj       目标对象
     * @param isInherit 是否获取父类属性值
     * @return Map
     */
    public static Map<String, Object> objectToMapExcludeNullVal(Object obj, boolean isInherit) {
        if (obj == null) return null;
        Map<String, Object> mapValue = new HashMap<>();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            //如果是final或static属性则跳过
            int modifiers = field.getModifiers();
            if (Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers)){
                continue;
            }
 
            String name = field.getName();
            String method = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
            String strGet = "get" + method;
            Method methodGet;
            try {
                methodGet = obj.getClass().getDeclaredMethod(strGet);
                Object object = methodGet.invoke(obj);
                if (object != null) {
                    mapValue.put(name, object);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (isInherit) mapValue = getGenericSuperclassFieldsToMapKeys(mapValue, obj);
 
        return mapValue;
    }
 
    /**
     * 把源对象的值复制到目标对象中
     *
     * @param targetObject 目标对象
     * @param sourceObject 临时对象(不支持继承属性拷贝)
     * @return 目标对象
     */
    public static <T> T objectCopy(T targetObject, Object sourceObject) {
        Class<?> cls = sourceObject.getClass();
        Class<?> cls2 = targetObject.getClass();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            //如果是final或static属性则跳过
            int modifiers = field.getModifiers();
            if (Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers)){
                continue;
            }
 
            Class<?> clsType = field.getType();
            String name = field.getName();
            String method = name.substring(0, 1).toUpperCase()
                    + name.substring(1, name.length());
            String strGet = "get" + method;
            try {
                Method methodGet = cls.getDeclaredMethod(strGet);
                Object object = methodGet.invoke(sourceObject);
                if (object != null) {
                    String strSet = "set" + method;
                    Method methodSet;
                    try {
                        methodSet = cls2.getDeclaredMethod(strSet, clsType);
                    } catch (NoSuchMethodException e) {
                        continue;
                    }
                    methodSet.invoke(targetObject, object);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return targetObject;
    }
 
    /**
     * 判断对象的所有非静态属性是否为空或""
     * @param obj 分析的对象
     * @return 对象的所有非静态属性是否为空或""
     */
    public static boolean objectFieldIsBlank(Object obj) {
        if (obj == null) return true;
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            //如果是final或static属性则跳过
            int modifiers = field.getModifiers();
            if (Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers)){
                continue;
            }
 
            String name = field.getName();
            String method = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
            String strGet = "get" + method;
            Method methodGet;
            try {
                methodGet = obj.getClass().getDeclaredMethod(strGet);
                Object object = methodGet.invoke(obj);
                if (object == null ||
                        (object instanceof String &&
                                org.apache.commons.lang3.StringUtils.isBlank((String) object))
                        ){
                    continue;
                }
                //除了以上的null 和String的""空串,则非Blank
                return false;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return true;
    }
 
    /**
     * 为对象(obj)继承直接父类的属性赋值
     *
     * @param <T> map
     * @param obj 目标对象
     * @return <T>
     */
    private static <T> T getGenericSuperclassFields(Map<String, Object> map, T obj) {
        if (obj.getClass().getGenericSuperclass() != null) {
            Class<?> superClass = obj.getClass().getSuperclass();// 父类
            Field[] fields = superClass.getDeclaredFields();
            for (Field field : fields) {
                Class<?> clsType = field.getType();
                String name = field.getName();
                String strSet = "set" + name.substring(0, 1).toUpperCase()
                        + name.substring(1, name.length());
                Method methodSet;
                try {
                    methodSet = superClass
                            .getDeclaredMethod(strSet, clsType);
                    if (map.containsKey(name)) {
                        methodSet.invoke(obj, map.get(name));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }
 
    /**
     * 获取对象(obj)继承直接父类的属性值
     *
     * @param mapValue map储存
     * @param obj      目标对象
     * @return Map
     */
    private static Map<String, Object> getGenericSuperclassFieldsToMapKeys(Map<String, Object> mapValue, Object obj) {
        if (obj.getClass().getGenericSuperclass() != null) {
            Class<?> superClass = obj.getClass().getSuperclass();// 父类
            Field[] fields = superClass.getDeclaredFields();
            for (Field field : fields) {
                String name = field.getName();
                String strSet = "get" + name.substring(0, 1).toUpperCase()
                        + name.substring(1, name.length());
                Method methodSet;
                try {
                    methodSet = superClass.getDeclaredMethod(strSet);
                    mapValue.put(name, methodSet.invoke(obj));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return mapValue;
    }
}

添加Maven依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表