一个POJO形式的Bean对象,包含一系列的属性定义以及属性所对应的 get 与 set 方法。因此我们需要使用Java的反射方法 getDeclaredFields()来获取这个对象中的字段列表。因为属性一般被定义为private,所以必须使用getDeclaredFields()方法,这个方法可以得到某个类的所有声明字段,即包括public、private和proteced,但是不包括父类的申明字段1。以下是实现代码:
private Map<String, Object> toMap(Object obj) {
Map<String, Object> result = new HashMap<>();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String key = field.getName();
Object value;
try {
value = field.get(obj);
} catch (Exception e) {
log.warn("取不到对象中名为 " + field.getName() + " 的值,将其置为空。", e);
continue;
}
result.put(key, value);
}
return result;
}
复制代码
因为是属性被 private 修饰,所以必须使用 setAccessible(true) 方法让其允许访问。
上一段代码并不实用,因为Date类型的属性会被解析为时间戳。
我们可以使用 Jackson 组件,它可以定义Date类型的属性格式。形如:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date areaTime;
复制代码
然后再使用 Jackson 的JSON 处理对象ObjectMapper,就可以转换为 Map对象:
Map<String, Object> values =
objectMapper.readValue(objectMapper.writeValueAsString(paramValues),
Map.class);
复制代码
这里先把 Bean 对象转换为字符串,然后再转换为 Map对象。ObjectMapper会读取 Bean 属性中的 @JsonFormat 注解,根据定义的格式进行转换。