属性的类型和大小写都不一致的两个类之间属性赋值

实战中经常碰到类1中的属性赋值给类2,但是两个类中的属性类型和大小写甚至下划线
不一致。尤其是不同语言或者不同技术做业务交互时更多。如果用spring框架
中的BeanUtils的方法会不好用,所以封装了一个工具类,如下:

注意事项:两个实体类中如果使用@Data注解是没有问题的,但是如果写原生get和set方法时必须规范。
source类中的实体必须全是小写的(后来发现的问题,已经解决,如下第二个代码类)
如果source是实体类,private static final long serialVersionUID = 4103899600927837110L;有这样的属性,那么会报错Method not found: is。。。

public class BeanUtil {

/**
     * 将接口类的值复制到业务类中
     *
     * @param source
     *            接口类
     * @param target
     *            业务类
     * @throws Exception
     */
    public static void copyPropertiesLowerCase(Object source, Object target) throws RuntimeException {
        try {
            Class sourceClazz = source.getClass();
            Class targetClazz = target.getClass();
            Field[] sourceFields = sourceClazz.getDeclaredFields();
            Field[] targetFields = targetClazz.getDeclaredFields();
            for (int i = 0; i < sourceFields.length; i++) {
                Field sourceField = sourceFields[i];
                PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName()
                        .toLowerCase(),
                        sourceClazz);
                Method rM = pdSource.getReadMethod();
                Object value = rM.invoke(source);
                if (value != null) {
                    for (int j = 0; j < targetFields.length; j++) {
                        Field targetField = targetFields[j];
                        if (sourceField.getName()
                                .replaceAll("_", "")
                                .toLowerCase()
                                .equals(targetField.getName()
                                        .replaceAll("_", "")
                                        .toLowerCase())) {
                            PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName(),
                                    targetClazz);
                            Method wM = pdTarget.getWriteMethod();
                            if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((XMLGregorianCalendar) value).toGregorianCalendar()
                                                    .getTime());
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (XMLGregorianCalendar) value);
                                }
                            }
                            else if ("class java.math.BigDecimal".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.lang.Long".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((BigDecimal) value).longValue());
                                }
                                else if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (BigDecimal) value);
                                }
                                else if ("class java.lang.Double".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            Double.valueOf(value.toString()));
                                }
                                else if ("class java.lang.String".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            String.valueOf(value.toString()));
                                }
                            }
                            else if (sourceField.getType()
                                    .toString()
                                    .equals(targetField.getType()
                                            .toString())) {
                                wM.invoke(target, value);
                            }
                            else if ("class java.lang.Double".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (BigDecimal.valueOf((Double) value)));
                                }
                                else {
                                    wM.invoke(target, (Double) value);
                                }
                            }
                            else if ("class java.lang.Long".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            new BigDecimal((Long) value));
                                }
                                else {
                                    wM.invoke(target, (Long) value);
                                }
                            }
                            else if ("class java.util.Date".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (Date) value);
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
}    

source类中的属性可以不全是小写

public class BeanUtil {

    public static void copyProperties(Object source, Object target) throws RuntimeException {
        try {
            Class sourceClazz = source.getClass();
            Class targetClazz = target.getClass();
            Field[] sourceFields = sourceClazz.getDeclaredFields();
            Field[] targetFields = targetClazz.getDeclaredFields();
            for (int i = 0; i < sourceFields.length; i++) {
                Field sourceField = sourceFields[i];
                PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName()
                        .toUpperCase(),
                        sourceClazz);
                Method rM = pdSource.getReadMethod();
                Object value = rM.invoke(source);
                if (value != null) {
                    for (int j = 0; j < targetFields.length; j++) {
                        Field targetField = targetFields[j];
                        if (sourceField.getName()
                                .replaceAll("_", "")
                                .toLowerCase()
                                .equals(targetField.getName()
                                        .replaceAll("_", "")
                                        .toLowerCase())) {
                            PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName()
                                    .toUpperCase(),
                                    targetClazz);
                            Method wM = pdTarget.getWriteMethod();
                            if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((XMLGregorianCalendar) value).toGregorianCalendar()
                                                    .getTime());
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (XMLGregorianCalendar) value);
                                }
                            }
                            else if ("class java.math.BigDecimal".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.lang.Long".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((BigDecimal) value).longValue());
                                }
                                else if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (BigDecimal) value);
                                }
                                else if ("class java.lang.Double".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            Double.valueOf(value.toString()));
                                }
                            }
                            else if (sourceField.getType()
                                    .toString()
                                    .equals(targetField.getType()
                                            .toString())) {
                                wM.invoke(target, value);
                            }
                            else if ("class java.lang.Double".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (BigDecimal.valueOf((Double) value)));
                                }
                                else {
                                    wM.invoke(target, (Double) value);
                                }
                            }
                            else if ("class java.lang.Long".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            new BigDecimal((Long) value));
                                }
                                else {
                                    wM.invoke(target, (Long) value);
                                }
                            }
                            else if ("class java.util.Date".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (Date) value);
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }


    /**
     * 将接口类的值复制到业务类中
     *
     * @param source
     *            接口类
     * @param target
     *            业务类
     * @throws Exception
     */
    public static void copyPropertiesLowerCase(Object source, Object target) throws RuntimeException {
        try {
            Class sourceClazz = source.getClass();
            Class targetClazz = target.getClass();
            Field[] sourceFields = sourceClazz.getDeclaredFields();
            Field[] targetFields = targetClazz.getDeclaredFields();
            for (int i = 0; i < sourceFields.length; i++) {
                Field sourceField = sourceFields[i];
                PropertyDescriptor pdSource = new PropertyDescriptor(sourceField.getName(),
                        sourceClazz);
                Method rM = pdSource.getReadMethod();
                Object value = rM.invoke(source);
                if (value != null) {
                    for (int j = 0; j < targetFields.length; j++) {
                        Field targetField = targetFields[j];
                        if (sourceField.getName()
                                .replaceAll("_", "")
                                .toLowerCase()
                                .equals(targetField.getName()
                                        .replaceAll("_", "")
                                        .toLowerCase())) {
                            PropertyDescriptor pdTarget = new PropertyDescriptor(targetField.getName(),
                                    targetClazz);
                            Method wM = pdTarget.getWriteMethod();
                            if ("class javax.xml.datatype.XMLGregorianCalendar".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((XMLGregorianCalendar) value).toGregorianCalendar()
                                                    .getTime());
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (XMLGregorianCalendar) value);
                                }
                            }
                            else if ("class java.math.BigDecimal".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.lang.Long".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            ((BigDecimal) value).longValue());
                                }
                                else if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (BigDecimal) value);
                                }
                                else if ("class java.lang.Double".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            Double.valueOf(value.toString()));
                                }
                                else if ("class java.lang.String".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            String.valueOf(value.toString()));
                                }
                            }
                            else if (sourceField.getType()
                                    .toString()
                                    .equals(targetField.getType()
                                            .toString())) {
                                wM.invoke(target, value);
                            }
                            else if ("class java.lang.Double".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            (BigDecimal.valueOf((Double) value)));
                                }
                                else {
                                    wM.invoke(target, (Double) value);
                                }
                            }
                            else if ("class java.lang.Long".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            new BigDecimal((Long) value));
                                }
                                else {
                                    wM.invoke(target, (Long) value);
                                }
                            }
                            else if ("class java.util.Date".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (Date) value);
                                }
                                else if ("class javax.xml.datatype.XMLGregorianCalendar".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target,
                                            XmlDateUtill.convertToXMLGregorianCalendar((Date) value));
                                }
                            }
                            else if ("class java.lang.String".equals(sourceField.getType()
                                    .toString())) {
                                if ("class java.util.Date".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, (Date) value);
                                }
                                if ("class java.math.BigDecimal".equals(targetField.getType()
                                        .toString())) {
                                    wM.invoke(target, new BigDecimal(value.toString()));
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值