gagadack 2024-01-25 11:17 采纳率: 50%
浏览 39
已结题

Java反射设置类的属性为null,求解决

通过自定义注解获取定义的属性值的时候最后获取到的对象的值为null,不能正确设置对象的值


public class FieldMapperUtil {

    public static void mapFields(Object source, Object destination) throws IllegalAccessException {
        Class<?> sourceClass = source.getClass();
        Class<?> destinationClass = destination.getClass();

        Field[] sourceFields = sourceClass.getDeclaredFields();
        Field[] destinationFields = destinationClass.getDeclaredFields();

        for (Field sourceField : sourceFields) {
            sourceField.setAccessible(true);
            for (Field destinationField : destinationFields) {
                destinationField.setAccessible(true);
                if (isInstanceField(destinationField) && destinationField.isAnnotationPresent(FieldMapping.class)) {
                    FieldMapping destFieldMapping = destinationField.getAnnotation(FieldMapping.class);
                    String destFieldName = destFieldMapping.value();
                    System.out.println(destFieldName);
                    mapField(sourceField, destinationField, source, destination);
                }
            }
        }
    }

    private static boolean isInstanceField(Field field) {
        return !Modifier.isStatic(field.getModifiers());
    }

    private static void mapField(Field sourceField, Field destinationField, Object source, Object destination) {
        try {
            sourceField.setAccessible(true);
            destinationField.setAccessible(true);

            Object value = sourceField.get(source);
            if (value != null) {
                destinationField.set(destination, value);
            }
//            destinationField.set(destination, value);
        } catch (IllegalAccessException e) {
            throw new RuntimeException("Failed to map fields: " + e.getMessage(), e);
        }
    }
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface FieldMapping {
    String value();
} 


```java
public static void main(String[] args) throws IllegalAccessException {
        // 创建一个 List<Map<String, Object>> 对象,其中包含多个 Map 对象
        List<Map<String, Object>> data = new ArrayList<>();

        // 创建一个 Map 对象,其中包含 BRANCH_NAME、USER_NAME、USER_CODE、ACCOUNT、BRANCH、AVAILABLE、ETF_CODE 等字段
        Map<String, Object> map1 = new HashMap<>();
        map1.put("BRANCH_NAME", "上海分行");
        map1.put("USER_NAME", "张三");
        map1.put("USER_CODE", "123456");
        map1.put("ACCOUNT", "1234567890");
        map1.put("AVAILABLE", "10000.0");
        map1.put("ETF_CODE", "000300");

        // 创建另一个 Map 对象
        Map<String, Object> map2 = new HashMap<>();
        map2.put("BRANCH_NAME", "北京分行");
        map2.put("USER_NAME", "李四");
        map2.put("USER_CODE", "654321");
        map2.put("ACCOUNT", "9876543210");
        map2.put("AVAILABLE", "20000.0");
        map2.put("ETF_CODE", "000016");

        // 将两个 Map 对象添加到 List 中
        data.add(map1);
        data.add(map2);

        List<CustomerInfo> userDataList = new ArrayList<>();

        for (Map<String, Object> map : data) {
            CustomerInfo userData = new CustomerInfo();
            FieldMapperUtil.mapFields(map, userData);
            userDataList.add(userData);
        }

        // 打印映射后的结果
        for (CustomerInfo userData : userDataList) {
            System.out.println(userData);
        }
    }




```java
@Data
public class CustomerInfo {

    @FieldMapping("BRANCH_NAME")
    public String branchId;

    @FieldMapping("USER_NAME")
    public String custName;

    @FieldMapping("USER_CODE")
    public String custCode;

    @FieldMapping("ACCOUNT")
    public String fundAccount;

    @FieldMapping("ETF_CODE")
    public String securityCode;

    @FieldMapping("AVAILABLE")
    public String overdraftAmount;

}

  • 写回答

3条回答 默认 最新

  • Huazie 优质创作者: 编程框架技术领域 2024-01-25 11:31
    关注

    你这遍历的属性,根本就不是 map里塞的值,而是HashMap里的属性

    img

    修改如下:

    img

    import org.apache.commons.collections4.MapUtils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.Map;
    
    public class FieldMapperUtil {
    
        public static void mapFields(Map<String, Object> sourceMap, Object destination) throws NoSuchFieldException {
            Class<?> destinationClass = destination.getClass();
    
            Field[] destinationFields = destinationClass.getDeclaredFields();
    
            for (Field destinationField : destinationFields) {
                destinationField.setAccessible(true);
                if (isInstanceField(destinationField) && destinationField.isAnnotationPresent(FieldMapping.class)) {
                    FieldMapping destFieldMapping = destinationField.getAnnotation(FieldMapping.class);
                    String destFieldName = destFieldMapping.value();
                    System.out.println(destFieldName);
                    mapField(MapUtils.getObject(sourceMap, destFieldName), destinationField, destination);
                }
            }
        }
    
        private static boolean isInstanceField(Field field) {
            return !Modifier.isStatic(field.getModifiers());
        }
    
        private static void mapField(Object sourceValue, Field destinationField, Object destination) {
            try {
                destinationField.setAccessible(true);
    
                if (sourceValue != null) {
                    destinationField.set(destination, sourceValue);
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException("Failed to map fields: " + e.getMessage(), e);
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月25日