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()));
        }

    }

 

posted @ 2019-08-16 12:02  一片番薯  阅读(2530)  评论(0编辑  收藏  举报