1. 程式人生 > >記錄bean轉Map的一個小bug

記錄bean轉Map的一個小bug

自己寫了一個Bean轉Map的工具類,錯誤程式碼如下:

package com.rjht.util;

import java.lang.reflect.Field;
import java.util.HashMap;

public class ConvertUtil {

    public static HashMap<String, Object> convertBean2Map(Object bean) throws IllegalArgumentException, IllegalAccessException {
        Field[] fields = bean.getClass().getFields();
        HashMap<String, Object> hashMap = new
HashMap<>(); if (fields != null) { //獲取Bean屬性和值 for (Field field : fields) { field.setAccessible(true); hashMap.put(field.getName(), field.get(bean)); } } return hashMap; } }

用工具類,得到的hashMap為空。查了API,發現問題出現在這裡:

Field[] fields = bean.getClass().getFields();

先看下Class類中對getFields()方法的定義:
這裡寫圖片描述
這個欄位可以返回類或介面的公共域,但是要注意下面四種情況:
1、如果該類或介面沒有可訪問的公共域,得到的陣列為空陣列;
2、如果該類有父類,將父類中的域一併返回;
3、如果該介面有父介面,將父結偶中的域一併返回;
4、當該類是陣列型別、原始型別或者為空時,得到的陣列為空陣列。

既然getFields()方法對域的可見性有限制,而我們不想修改bean時,可以選擇使用getDeclaredFields()方法。

正確程式碼如下:

package com.rjht.util;

import java.lang.reflect.Field;
import java.util.HashMap;

public class ConvertUtil {

    public static HashMap<String, Object> convertBean2Map(Object bean) throws IllegalArgumentException, IllegalAccessException {
        Field[] fields = bean.getClass().getDeclaredFields();
        HashMap<String, Object> hashMap = new HashMap<>();
        if (fields != null) {
            //獲取Bean屬性和值
            for (Field field : fields) {
                field.setAccessible(true);
                hashMap.put(field.getName(), field.get(bean));
            }
        }
        return hashMap;
    }
}