目录
通过Annotation实现Bean转Map时自定义key和value默认值
工具类
ToMap.java
package com.hahashujia.basic.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author hahashujia
* Bean转Map时自定义字段key
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ToMap {
// 自定义key
String key();
// 自定义值
boolean defaultValueFlag() default false;
// 自定义值
String defaultValue() default "";
}
MapBeanUtil.java
package com.hahashujia.basic.util;
import com.hahashujia.basic.annotation.ToMap;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author hahashujia
* @describe
* @createTime 2020-09-18 18:15
*/
public class MapBeanUtil {
/**
* 实体对象转成Map
*
* @param obj 实体对象
* @return
*/
public static Map<String, Object> bean2MapCustomKey(Object obj) {
Map<String, Object> map = new HashMap<>(16);
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
List<Field> fieldList = getAllField(clazz);
try {
for (Field field : fieldList) {
field.setAccessible(true);
String key = field.getName();
Object value = field.get(obj);
if (field.isAnnotationPresent(ToMap.class)) {
key = field.getDeclaredAnnotation(ToMap.class).key();
if (value == null) {
if (field.getDeclaredAnnotation(ToMap.class).defaultValueFlag()) {
value = field.getDeclaredAnnotation(ToMap.class).defaultValue();
} else {
continue;
}
}
}
map.put(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 实体对象转成Map
*
* @param obj 实体对象
* @return
*/
public static Map<String, Object> object2Map(Object obj) {
Map<String, Object> map = new HashMap<>(16);
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
List<Field> fieldList = getAllField(clazz);
try {
for (Field field : fieldList) {
field.setAccessible(true);
map.put(field.getName(), field.get(obj));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* Map转成实体对象
*
* @param map 实体对象包含属性
* @param clazz 实体对象类型
* @return
*/
public static Object map2Object(Map<String, Object> map, Class<?> clazz) {
if (map == null) {
return null;
}
Object obj = null;
try {
obj = clazz.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
field.set(obj, map.get(field.getName()));
}
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
/**
* 获取class 的所有属性字段&&父类的字段
*/
private static List<Field> getAllField(Class clazz) {
List<Field> fieldList = new ArrayList<>();
Class tempClass = clazz;
while (tempClass != null) {
fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass();
}
return fieldList;
}
}
使用
DataCommonVO.java
package com.hahashujia.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.hahashujia.basic.annotation.ToMap;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @author hahashujia
* @describe
* @createTime 2021-03-18 17:51
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataCommonVO {
@ApiModelProperty(value = "语言(ZHS/US)", example = "ZHS")
@ToMap(key = "language", defaultValueFlag = true)
private String lang;
@ApiModelProperty("最后更新日期从(yyyy-MM-dd HH:mm:ss)")
@ToMap(key = "last_update_date_from", defaultValueFlag = true)
@JSONField(name = "lastDate")
private String lastUpdateDateFrom;
@ApiModelProperty("最后更新日期至(yyyy-MM-dd HH:mm:ss)")
@ToMap(key = "last_update_date_to", defaultValueFlag = true)
@JSONField(name = "lastDate")
private String lastUpdateDateTo;
}
调用示例:
DataCommonVO vo = new DataCommonVO();
Map<String, Object> paramMap = MapBeanUtil.bean2MapCustomKey(vo);
结果:
![结果](https://img-blog.csdnimg.cn/20210323165816556.png)