博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java反射之Bean修改更新属性值等工具类
阅读量:4975 次
发布时间:2019-06-12

本文共 9439 字,大约阅读时间需要 31 分钟。

package com.bocean.util; import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Date;import java.util.Map; import com.bocean.annotation.Validate;import com.bocean.entity.healthManage.HealthIndex;import com.bocean.entity.healthManage.HealthManage;import com.google.common.collect.Maps; /** * 利用反射通过bean之间的对比对属性进行修改/更新等 *  * @author only29 */public class BeanRefUtil {      /**     * 复制source -> target (并过滤值为0/0.0/""等置null,以免影响推送)     * 属性的复制建议采用:Dozer     * @param source     * @param destinationClass     * @param ignoreZero 是否过滤属性值为null/0/""     * @param 
     * @return     */    public static
T copyBean(Object source, Class
destinationClass, Boolean ignoreZero) {        Map
valMap = bean2Map(source);        T t = null;        try {            t = copyFieldValue(destinationClass, valMap, ignoreZero);        } catch (Exception e) {            e.printStackTrace();        }        return t;    }     /**     * 从source(old 实体)对应属性更新到target(从数据库获取的实体)     * 并判断新老对象属性值是否全是一致(即是否需要更新到数据库)     * @param source     * @param target     * true 需要更新,false 不需要更新     */    public static boolean updateBean(Object source, Object target) {        Map
valMap = bean2Map(source);        return updateFieldValue(target, valMap);    }     /**     * target 通过与 source 带有自定义的annotation的属性进行比较,只筛选更新的属性保存到数据库,其他为更新的设置NULL     *      * @param source     * @param target     */    public static void compareAndUpdateProperty(Object source, Object target, Class annotation) {        Map
valMap = bean2Map(source);        setNoUpdateFieldToNull(target, valMap, annotation);    }     /**     * 将相应的bean转化为map(属性->value)     *      * @param source     * @return     */    public static Map
bean2Map(Object source) {        Class
cls = source.getClass();        Map
valueMap = Maps.newHashMap();        Field[] fields = cls.getDeclaredFields();         for (Field field : fields) {            try {                String result = getFieldValue(source, field);                valueMap.put(field.getName(), result);            } catch (Exception e) {                continue;            }        }        return valueMap;    }     /**     * 将实体source有更新的属性更新到对应的实体target     *      * @param target     * @param valMap     */    private static void setNoUpdateFieldToNull(Object target,                                               Map
valMap, Class annotation) {        Class
cls = target.getClass();         Field[] fields = cls.getDeclaredFields();         for (Field field : fields) {            try {                if(isAppointAnnotation(target, field, annotation)){                    String o = valMap.get(field.getName());                    String n = getFieldValue(target, field);                    if (validNullAndEmptyString(o) && o.equals(n))                        setFieldValue(target, field, null);                }            } catch (Exception e) {                continue;            }        }    }     /**     * 将实体source有更新的属性更新到对应的实体target     * 并判断新老对象值是否是一致(即是否需要更新到数据库)     * @param target     * @param valMap     */    private static boolean updateFieldValue(Object target,            Map
valMap) {        boolean flag = false;         Class
cls = target.getClass();         Field[] fields = cls.getDeclaredFields();         for (Field field : fields) {            try {                String o = valMap.get(field.getName());                String n = getFieldValue(target, field);                if (validNullAndEmptyString(o) && !o.equals(n)){                    setFieldValue(target, field, o);                    flag = true;                }            } catch (Exception e) {                continue;            }        }        return flag;    }     /**     * set属性的值到Bean     * @param cls     * @param valMap     * @param ignoreZero 是否过滤属性值为0     * @param
     * @return     * @throws Exception     */    private static
T copyFieldValue(Class
cls, Map
valMap, Boolean ignoreZero) throws Exception{         Field[] fields = cls.getDeclaredFields();         T t = cls.newInstance();         for (Field field : fields) {            try {                String value = valMap.get(field.getName());                if(ignoreZero && !judgeValue(value))                  setFieldValue(t, field, value);            } catch (Exception e) {                continue;            }        }         return t;    }     /**     * 根据字段获取对应的值     *      * @param bean     * @param field     * @return     * @throws Exception     */    public static String getFieldValue(Object bean, Field field)            throws Exception {        Class
cls = bean.getClass();        String fieldType = field.getType().getSimpleName();// 属性类型        Method[] methods = cls.getDeclaredMethods();        String fieldGetName = getMethodName(field.getName());        String result = null;        // 判断是否有该属性的get方法,没有返回null        if (checkGetMethod(methods, fieldGetName)) {            Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});            Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});            if ("Date".equals(fieldType)) {                result = DateUtil.formatDateTime((Date) fieldVal);            } else {                if (null != fieldVal) {                    result = String.valueOf(fieldVal);                }            }        }        return result;    }     /**     * 根据属性设置值,仅支持基本类型     *      * @param bean     * @param field     * @param value     * @throws Exception     */    public static void setFieldValue(Object bean, Field field, String value)            throws Exception {        Class
cls = bean.getClass();        Method[] methods = cls.getDeclaredMethods();        // 属性set方法名        String fieldSetName = setMethodName(field.getName());        if (checkSetMethod(methods, fieldSetName)) {            Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());// set方法            if (validNullAndEmptyString(value)) {                String fieldType = field.getType().getSimpleName();                if ("String".equals(fieldType)) {                    fieldSetMet.invoke(bean, value);                } else if ("Date".equals(fieldType)) {                    Date temp = DateUtil.parseDate(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Short".equalsIgnoreCase(fieldType)) {                    Short temp = Short.parseShort(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Integer".equals(fieldType)                        || "int".equals(fieldType)) {                    Integer temp = Integer.parseInt(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Float".equalsIgnoreCase(fieldType)) {                    Float temp = Float.parseFloat(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Long".equalsIgnoreCase(fieldType)) {                    Long temp = Long.parseLong(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Double".equalsIgnoreCase(fieldType)) {                    Double temp = Double.parseDouble(value);                    fieldSetMet.invoke(bean, temp);                } else if ("Boolean".equalsIgnoreCase(fieldType)) {                    Boolean temp = Boolean.parseBoolean(value);                    fieldSetMet.invoke(bean, temp);                } else {                    System.out.println("not supper type" + fieldType);                }            } else { //value=null或者""                fieldSetMet.invoke(bean, value);            }        } else {            System.out.println("not this set method : " + fieldSetName);        }    }     /**     * 判断实体属性值是否全部为null     * @param bean     * @return     */    public static void zero2Null(Object bean){        Boolean flag = true;        try {            Class
srcClass = bean.getClass();            Field[] fields = srcClass.getDeclaredFields();            // 比较属性值            for (Field field : fields) {             }        } catch (Exception e) {            e.printStackTrace();        }    }     /**     * 判断实体属性值是否全部为null     * @param bean     * @return     */    public static boolean isNullSelectProperties(Object bean, Class annotation){        Boolean flag = true;        try {            Class
srcClass = bean.getClass();            Field[] fields = srcClass.getDeclaredFields();            // 比较属性值            for (Field field : fields) {                if(isAppointAnnotation(bean, field, annotation)){                    // 原属性值                    Object so = getFieldValue(bean, field);                    boolean j = judgeValue(so == null?"":so.toString());                    if(!j){                        flag = false;                        break;                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        return flag;    }     /**     * 判断某个字段的get方法是否有指定的annotation     * @param bean     * @param field     * @param annotation     * @return     * @throws Exception     */    public static boolean isAppointAnnotation(Object bean, Field field, Class annotation) throws Exception{        if(annotation == null) return false;        Class
cls = bean.getClass();        Method[] methods = cls.getDeclaredMethods();        String fieldGetName = getMethodName(field.getName());        // 判断是否有该属性的get方法,没有返回null        if (checkGetMethod(methods, fieldGetName)) {            Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});            Annotation clazz = fieldGetMet.getAnnotation(annotation);            if(clazz != null)                return true;        }        return false;    }     /**     * 判断是否存在某属性的 set方法     *      * @param methods     * @param fieldSetMet     * @return     */    public static boolean checkSetMethod(Method[] methods, String fieldSetMet) {        for (Method met : methods)            if (fieldSetMet.equals(met.getName()))                return true;        return false;    }     /**     * 判断是否存在某属性的 get方法     *      * @param methods     * @param fieldGetMet     * @return     */    public static boolean checkGetMethod(Method[] methods, String fieldGetMet) {        for (Method met : methods)            if (fieldGetMet.equals(met.getName()))                return true;        return false;    }     /**     * 拼接某属性的 get方法     *      * @param fieldName     * @return     */    public static String getMethodName(String fieldName) {        if (null == fieldName || "".equals(fieldName)) {            return null;        }        return "get" + fieldName.substring(0, 1).toUpperCase()                + fieldName.substring(1);    }     /**     * 拼接在某属性的 set方法     *      * @param fieldName     * @return     */    public static String setMethodName(String fieldName) {        if (null == fieldName || "".equals(fieldName)) {            return null;        }        return "set" + fieldName.substring(0, 1).toUpperCase()                + fieldName.substring(1);    }     /**     * 判断字段名是否包含id,将其过滤     * @param fieldName     * @return     */    public static boolean isContainId(String fieldName){        return (fieldName.contains("id") || fieldName.contains("Id"));    }     /**     * 验证null/""     * @param value     * @return     */    private static boolean validNullAndEmptyString(String value) {        return (null != value && !"".equals(value));    }     /**     * 判断数据类型     * @param tarValue     * @return     */    private static Boolean judgeValue(String tarValue){        return ("".equals(tarValue) || "0".equals(tarValue) || "0.0".equals(tarValue));    }     public static void main(String args[]) {        HealthManage hm = new HealthManage();        hm.setPatientId(4942);        hm.setCalories(25.6f);        hm.setBloodSugar("220");        hm.setSpeed(120f);         HealthIndex hi = new HealthIndex();        hi.setBloodSugar("230");        hi.setBMI(2.6f);        hi.setSpeed(120f);         BeanRefUtil.compareAndUpdateProperty(hm,hi, Validate.class);         System.out.println(hi.getSpeed());    } }

 

转载于:https://www.cnblogs.com/lxl57610/p/10899838.html

你可能感兴趣的文章
sgu116
查看>>
2.变量
查看>>
Spring—Quartz定时调度CronTrigger时间配置格式的实例
查看>>
大白话描述事件 [转]
查看>>
面试-java算法题
查看>>
IDEA类和方法注释模板设置(非常详细)
查看>>
eclipse生成并调用webservices客户端client
查看>>
Java--动态代理
查看>>
day05列表 类型
查看>>
闲聊测试工程师
查看>>
如何在线编辑修改PDF文件中的背景颜色
查看>>
angularJS 学习之路
查看>>
php header
查看>>
汇编第一章总结
查看>>
java-面向对象编程
查看>>
TCP协议
查看>>
【iOS学习笔记】01-开篇
查看>>
MySQL多实例安装
查看>>
用一个玩具例子说明基于视频的超分辨率重建的基本思想
查看>>
集训 D1T1 clique
查看>>