使用注解实现不同字段值的bean的属性拷贝

        今天在工作中遇到了一个问题,就是获取了A对象,需要把A对象的某些属性值拷贝到B对象当中,我们都知道在有相同字段的情况下可以使用Spring提供的工具类BeanUtils.copyProperties(Source, Target)来实现。但是在字段名称不同的情况下,这个方法就无能为力了,因此我们需要自己去实现一个工具类来实现这个功能。

        整体的设计思路很简单,定义一个注解,用于标注目标对象的字段,标明这个字段的来源字段是哪个,比如Source对象的userId字段对应Target字段的id,那我们就在id字段加上自定义的注解,注解中标明属性拷贝的时候来源字段是Source对象的userId,接着我们在工具类中仿照BeanUtils.copyProperties方法,先获取到目标对象的set方法,然后从源对象中取值放入目标对象中,从而完成对不同字段的拷贝。

        首先完成自定义的注解@CopyField,其中定义一个方法source(),用于标注目标对象的来源,代码如下:

@CopyField注解

        然后新建BeanUtils类,在其中仿照BeanUtils.copyProperties来写自己的方法,思路还是按照一开始的整体思路来,首先利用反射获取到目标对象的所有字段,并遍历进行解析,解析字段的时候判断当前字段属性是否有@CopyField注解,有的话则获取其中的sourceName并获取当前字段属性的set方法,再然后根据sourceName从源对象中获取对应字段的get方法取出源值,然后调用set方法将值放入目标对象当中,整体方法代码如下:

copyProperties方法

           代码已经完成接下来进行一下测试,新建SourceUser类和TargetUser类:

TargetUser类
SourceUser

        可以看到我们在TargetUser类上使用了我们的自定义注解,标明在复制的时候,字段对应来源是源对象的UsernameUserId字段。接下来进行测试。新建test类,在main方法中new一个SourceUser对象,并且使用我们的拷贝方法:

测试类

        从测试结果中可以看到SourceTarget的字段已经成功拷贝到了TargetUser中,并且不影响相同字段(图中的sex字段)的拷贝。

        一个小小的技巧,希望对遇到这个问题的人有一点小小的参考价值。

推荐阅读更多精彩内容