Bean属性复制,字段名可不同,字段类型不同需要自行处理
@Setter @Getter public class SourceA { private String name; private String text; public SourceA(String name, String text) { this.name = name; this.text = text; } }
@Setter @Getter @ToString public class TargetB {
@FieldMap(name = "name") public LocalDateTime n; private String text; }
注解字段名
@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FieldMap { String name() default ""; }
实现,如果字段类型相同可以赋值,但是可能会有不同的时候。
public static void copy(Object source, Object target) throws Exception { Class<?> sourceClass = source.getClass(); Class<?> bClass = target.getClass(); Field[] soutceFields = sourceClass.getDeclaredFields(); Map<String, Object> sourceMap = new HashMap<>(); for (Field field : soutceFields) { field.setAccessible(true); sourceMap.put(field.getName(), field.get(source)); } Field[] targetFields = bClass.getDeclaredFields(); for (Field field : targetFields) { field.setAccessible(true); FieldMap annotation = field.getAnnotation(FieldMap.class); if (annotation != null) { String name = annotation.name(); Object sourceValue = sourceMap.get(name); if (field.getType() == sourceClass.getDeclaredField(name).getType()) { field.set(target, sourceValue); } else { /** * 比如source的date字段类型为String,target接收date字段的类型为LocalDateTime */ } continue; } field.set(target, sourceMap.get(field.getName())); } }