解决pyproperties实体类对象不⼀致的问题
今天给⼤家分析⼀个解决pyproperties实体类对象名不⼀致的解决⽅法,⼀般我们在两个对象拷贝的问题上,我个⼈⽤的⽐较多的就是pyproperties,字段名如果不⼀致的话就去实体类中使⽤重载,把当前实体类的对象赋值给另外⼀个对象,也有⽤到set(),当然这些也都能解决pyproperties实体类属性不⼀致的问题,不过今天要给⼤家分享的是,不⽤set()和实体类的重构,使⽤类的反射机制去完成!
话不多说直接开始:
我是选择重写了⼀个实体类copy⼯具类⾸先要获取传过来的两个对象的类( getClass() ⽅法),
通过获取类再去获取对象中的属性
( getDeclaredFields() ⽅法)
fieId.setAccessible(true) ⽅法是false时不允许通过反射访问该字段,所以要设置成true⽤⼀个HashMap去接受,
第⼆个类也是⼀样的操作
都说了是解决实体类属性不⼀致的⽅法啦,所以实体类要有不⼀样的字段,那么我们应该怎么让系统知道这个字段和那个字段是要⼲⼀件事情呢?
就⽐如,欸我今天不去钓鱼,要去当舔 ,就是玩,朋友他只能去当舔 ,我们的⽬的都是当舔 ,但是出发点都是不同,所以
要让系统知道我们要去⼲嘛这时候要⽤到⼀个注解(FieldMap )让系统清楚我们要去⼲同⼀件事情
这是FieldMap类
既然我们已经让系统知道了谁要去⼲嘛了,当然要去获取他了,这时候就要⽤到Annotation()⽅法了,获取注解上的Name的值,然后拿Name的值去做判断,所以⽤到了getType()去获取类型去做判断
这样就解决了pyproperties实体类对象不⼀致就copy不进去的问题了。
spring的pyProperties(obj1, obj2);复制对象时字段类型不⼀致,导致赋值不上
当⽤spring的pyProperties(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;
javabean是干嘛的}
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代码可以重载的原因。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。