玩命加载中🤣🤣🤣

自定义注解实现实体类映射


自定义注解实现实体类映射

说明:根据 Map 自动将其映射成所对应的实体,其中 map 的 key 与属性灵活对应

定义元注解

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 MappingKey {
    String value();
}

定义转换工具类

  1. 实例目标对象
  2. 获取目标类属性
  3. 遍历所有属性
  4. 通过属性注解拿到 map 中的 key
  5. 通过 map.get(key) 取到对应的值
  6. 给对象赋值
import java.lang.reflect.Field;
import java.util.Map;

public class ConvertUtil {

    /**
     * 自动转换属性
     * @param map
     * @param clazz
     * @return
     * @param <T>
     */
    public static <T> T convert(Map<String, String> map, Class<T> clazz){
        T instance = null;
        try {
            instance = clazz.newInstance();
            Field[] fields = clazz.getDeclaredFields();
            for (Field f : fields) {
                if (f.isAnnotationPresent(MappingKey.class)) {
                    MappingKey anno = f.getAnnotation(MappingKey.class);
                    String key = anno.value();
                    if (map.containsKey(key)) {
                        f.setAccessible(true);
                        f.set(instance, map.get(key));
                    }
                }
            }
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return instance;
    }
}

实体类

@Data
public class ElementInfo {
    @MappingKey("序号")
    private String index;
    @MappingKey("姓名")
    private String name;
    @MappingKey("性别")
    private String sex;
    @MappingKey("手机号码")
    private String phone;
}

测试类

@Test
public void test01() {
    HashMap<String, String> elements = new HashMap<>();
    elements.put("序号", "0002");
    elements.put("姓名", "张三");
    elements.put("性别", "男");
    elements.put("phone", "13012341234");
    // 转换属性
    DemoScript.ElementInfo element = ConvertUtil.convert(elements, ElementInfo.class);
    System.out.println(element);
}

文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录