您现在的位置是:首页 > 正文

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

2024-04-01 00:22:06阅读 2
实战中经常碰到类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());
        }
    }
}

网站文章

  • PyTorch中的两类乘法 最新发布

    PyTorch中的两类乘法

    2024-04-01 00:21:59
  • centos7安装docker 并创建mysql

    centos7安装docker 并创建mysql

    Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24个月。Docker CE 分为 stable test 和 nightly 三个更新频道。官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。

    2024-04-01 00:21:52
  • C#判断质数

    //判断质数片段 static void ZhiShu(int[] array) { int num = 0; for (int i = 0; i { num = array[i]; if (IsZhiShu(nu

    2024-04-01 00:21:13
  • paxos分布式一致性算法--讲述诸葛亮的反穿越

    原文:http://blog.csdn.net/russell_tao/article/details/72445300、引子一日,诸葛亮找到刘备,突然献上一曲《独角戏》,而后放声大哭。刘备正沉醉于新曲,暗叹孔明大才,竟作得如此不凡仙乐,看到孔明忽而大悲,慌问:“水,何事悲恸?” 诸葛亮止住抽泣:“亮自主公三顾茅庐出山以来,蒙主公厚爱,自比如鱼得水,敢不尽力?然

    2024-04-01 00:21:06
  • Server side event (SSE)实现消息推送功能

    Server side event (SSE)实现消息推送功能

    目录问题场景Server side event (SSE)简介在后端使用SSE功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建...

    2024-04-01 00:20:58
  • CNAME记录 - 构建高效网络解析的关键步骤 最新发布

    CNAME记录全称为“Canonical Name”记录,中文译为“规范名称”记录。它是DNS中的一种资源记录类型,主要用于创建域名的别名。通过CNAME记录,我们可以将一个域名的解析指向另一个域名,实现域名的重定向。

    2024-04-01 00:20:32
  • sass、less异同

    相同点:1、混入(Mixins):class中的class2、参数混入:可以传递参数的class,就像函数一样3、嵌套规则:class中嵌套class,从而减少重复的代码4、运算:css中用上数学5、颜色功能:可以编辑颜色6、名字空间:分组样式,从而可以被调用7、作用域:局部修改样式8、JavaScript赋值:在css中使用JavaScript表达式赋值...

    2024-04-01 00:20:19
  • 【HTML-css】渐变(线性渐变 径向渐变)动画效果(2D变形 3D变形)过渡效果 最新发布

    【HTML-css】渐变(线性渐变 径向渐变)动画效果(2D变形 3D变形)过渡效果 最新发布

    paused 规定动画。matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n) 定义 3D转换,使用 16 个值的 4x4 矩阵。ease-in-out 规定以慢速开始和结...

    2024-04-01 00:19:53
  • ubuntu 查看 cuda 和 cudnn 版本

    查看cuda版本cat /usr/local/cuda/version.txt查看cudnn 版本cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

    2024-04-01 00:19:42
  • hello 驱动编写-最简单的驱动程序

    hello 驱动编写-最简单的驱动程序

    编写驱动程序步骤: 确定主设备号 定义自己的 file_operations 结构体 实现对应的 open/read/write函数,填写入结构体 把file_operations 结构体告诉内核,注...

    2024-04-01 00:19:34