首页 > 其他 > 详细

Bean属性复制,字段名可不同,字段类型不同需要自行处理

时间:2019-08-16 13:33:15      阅读:75      评论:0      收藏:0      [点我收藏+]
@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()));
        }

    }

 

Bean属性复制,字段名可不同,字段类型不同需要自行处理

原文:https://www.cnblogs.com/nmnm/p/11363072.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!