解决Beanutils.copyproperties实体类对象不一致的问题

 更新时间:2021年06月16日 09:54:43   作者:Java中的kids  
这篇文章主要介绍了解决Beanutils.copyproperties实体类对象不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

今天给大家分析一个解决Beanutils.copyproperties实体类对象名不一致的解决方法,一般我们在两个对象拷贝的问题上,我个人用的比较多的就是Beanutils.copyproperties,字段名如果不一致的话就去实体类中使用重载,把当前实体类的对象赋值给另外一个对象,也有用到set(),当然这些也都能解决Beanutils.copyproperties实体类属性不一致的问题,不过今天要给大家分享的是,不用set()和实体类的重构,使用类的反射机制去完成!

话不多说直接开始:

我是选择重写了一个实体类copy工具类首先要获取传过来的两个对象的类( getClass() 方法),

通过获取类再去获取对象中的属性

( getDeclaredFields() 方法)

fieId.setAccessible(true) 方法是false时不允许通过反射访问该字段,所以要设置成true用一个HashMap去接受,

第二个类也是一样的操作

都说了是解决实体类属性不一致的方法啦,所以实体类要有不一样的字段,那么我们应该怎么让系统知道这个字段和那个字段是要干一件事情呢?

就比如,欸我今天不去钓鱼,要去当舔🐕,就是玩,朋友他只能去当舔🐕,我们的目的都是当舔🐕,但是出发点都是不同,所以要让系统知道我们要去干嘛 这时候要用到一个注解(FieldMap )让系统清楚我们要去干同一件事情

这是FieldMap类

既然我们已经让系统知道了谁要去干嘛了,当然要去获取他了,这时候就要用到fleId.getAnnotation()方法了,获取注解上的Name的值,然后拿Name的值去做判断,所以用到了getType()去获取类型去做判断

这样就解决了Beanutils.copyproperties实体类对象不一致就copy不进去的问题了。

spring的BeanUtils.copyProperties(obj1, obj2);复制对象时字段类型不一致,导致赋值不上

当用spring的BeanUtils.copyProperties(obj1, obj2);对象进行复制时,因为在obj1 类型的对象中定义的属性类型不同(set方法中用的是Integer类型,get方法中返回的是int类型):

public int getNumber() {
    return number;
  }
  public void setNumber(Integer number) {
    this.number = number;
  }

这样在使用复制方法时,就不会对这个number属性进行赋值。这里必须是:

public int getNumber() {
    return number;
  }
  public void setNumber(int number) {
    this.number = number;
  }

这里是因为:spring在利用反射复制对象时,是以javaBean的规范来使用get/set方法进行设置值的。同时set方法的参与类型,在classLoader中,也会被计为函数名的一部分。

所有这里必须都是int类型或者都是integer类型。否则spring就不会对该属性进行复制相应的值。

第二个知识点:

应用场景:当我修改一个工程里的jar包内的一个类时(其实改动,就是把上一个知识点里的Integer类型修改成了int类型),然后到去替换服务器上对应的jar包后,重启工程会出现:NoSuchMethodError这样的错。

原因是:基本数据类型与包装类型的解包封包是由编译器提供的(这在jdk 1.5引入)。void setNumber(int a)与 void setNumber(Integer a); 对于编译器来说是不同的方法,他们的有着不同的方法签名。

这里就涉及到Java编辑器对Java方法编译的问题:在Java中,编辑器会把函数的参数列表与函数名称一起作为内存中标记函数唯一性的标识,这也是Java代码可以重载的原因。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot+Redis海量重复提交问题解决

    SpringBoot+Redis海量重复提交问题解决

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,所以本文介绍一下SpringBoot+Redis海量重复提交问题解决,感兴趣的可以了解一下
    2023-12-12
  • springboot注册拦截器所遇到的问题

    springboot注册拦截器所遇到的问题

    这篇文章主要介绍了springboot注册拦截器的方法及所遇到的问题,需要的朋友可以参考下
    2018-07-07
  • Java web项目中的强制登录功能实现代码

    Java web项目中的强制登录功能实现代码

    本文给大家分享Java web项目中的强制登录功能实现代码,为了避免直接进入项目中存在的页面,使用filter过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • SpringBoot个性化启动Banner设置方法解析

    SpringBoot个性化启动Banner设置方法解析

    这篇文章主要介绍了SpringBoot个性化启动Banner设置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java Cloneable接口的深拷贝与浅拷贝详解

    Java Cloneable接口的深拷贝与浅拷贝详解

    这篇文章主要为大家详细介绍了Java Cloneable接口的深拷贝与浅拷贝,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Mybatis 如何传入字符串参数,分割并遍历

    Mybatis 如何传入字符串参数,分割并遍历

    这篇文章主要介绍了Mybatis 如何传入字符串参数,分割并遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • druid执行SQL出现错误但不影响返回结果的问题及解决

    druid执行SQL出现错误但不影响返回结果的问题及解决

    这篇文章主要介绍了druid执行SQL出现错误但不影响返回结果的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java类的序列化版本唯一标识符serialVersionUID使用

    Java类的序列化版本唯一标识符serialVersionUID使用

    serialVersionUID是一个类的序列化版本唯一标识符,用于确保在反序列化过程中类的实例与序列化文件中的类版本相匹配,它在版本兼容性和安全性方面起着关键作用
    2025-01-01
  • 利用Java代码写一个并行调用模板

    利用Java代码写一个并行调用模板

    这篇文章主要介绍了利用Java代码写一个并行调用模板,文章基于Java的相关内容展开写一个并行调用模板的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 带你盘点Java的五种运算符

    带你盘点Java的五种运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-07-07

最新评论