java两个不同类的对象相同属性赋值

发布时间 2023-03-31 13:41:36作者: 莴苣&

一、外部工具包

  Java中有很多工具包可以用来实现对象属性复制,其中比较常用的有以下几个:

  1. Apache Commons BeanUtils:提供了一组简单易用的API,可以实现对象属性的复制、获取、设置等操作。

  2. Spring Framework BeanUtils:与Apache Commons BeanUtils类似,提供了一组API,可以实现对象属性的复制、获取、设置等操作。

  3. Dozer:一个开源的Java对象映射工具,可以实现不同类型对象之间的属性映射。

  4. MapStruct:一个基于注解的Java对象映射工具,可以自动生成类型安全的映射代码。

  这些工具包都有详细的文档和示例,可以根据具体需求选择合适的工具包来实现对象属性复制。

二、Java反射机制来实现这个功能

  具体步骤如下:

  1. 获取源对象和目标对象的Class对象。

  2. 获取源对象的所有属性,遍历每个属性。

  3. 判断目标对象是否存在与源对象相同名称的属性,如果存在则将源对象的属性值赋值给目标对象的属性。

  4. 复制完成后返回目标对象。

  示例代码如下:

 1 public static <T, S> T copyProperties(S source, T target) throws Exception {
 2     Class<?> sourceClass = source.getClass();
 3     Class<?> targetClass = target.getClass();
 4 
 5     Field[] sourceFields = sourceClass.getDeclaredFields();
 6     for (Field sourceField : sourceFields) {
 7         String fieldName = sourceField.getName();
 8         Field targetField = null;
 9         try {
10             targetField = targetClass.getDeclaredField(fieldName);
11         } catch (NoSuchFieldException e) {
12             // 目标对象不存在该属性,忽略
13             continue;
14         }
15 
16         sourceField.setAccessible(true);
17         targetField.setAccessible(true);
18 
19         Object value = sourceField.get(source);
20         targetField.set(target, value);
21     }
22 
23     return target;
24 }

使用示例:

 1 class Source {
 2     private String name;
 3     private int age;
 4     // getter and setter
 5 }
 6 
 7 class Target {
 8     private String name;
 9     private String address;
10     // getter and setter
11 }
12 
13 Source source = new Source();
14 source.setName("Tom");
15 source.setAge(20);
16 
17 Target target = new Target();
18 target.setAddress("Beijing");
19 
20 copyProperties(source, target);
21 
22 System.out.println(target.getName()); // 输出 "Tom"
23 System.out.println(target.getAddress()); // 输出 "Beijing"