解决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代码可以重载的原因。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。