一個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 註解,根據定義的格式進行轉換。