自定义注解实现实体类映射
说明:根据 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();
}
定义转换工具类
- 实例目标对象
- 获取目标类属性
- 遍历所有属性
- 通过属性注解拿到 map 中的 key
- 通过 map.get(key) 取到对应的值
- 给对象赋值
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);
}