項目中經常會遇到,一個對象中有另外一個屬性DTO,當我們判斷這個DTO不為null的時候,我們會去做一些其他的操作,比如落入擴展屬性表,但是上游的調用方經常會new 一個新對象出來,這樣判斷出來不為null就是true,那么就會插入很多實際上不需要插入的數據庫記錄
怎么能判斷出來這個對象知識new出來的一個空對象呢,沒有任何一個屬性值
最先想到的辦法就是拿出來所有的屬性,判斷是否有值,那么如果針對每一個DTO的屬性單獨去寫,實際上做了很多重復的工作,那么寫一個util工具類,統一處理這類場景
邏輯就是用反射,拿出來所有的屬性,然后判斷,代碼如下:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.util.Collection; /** * 判斷對象實體的屬性是否為空 */ public class ObjectNullUtil { private final static Logger LOGGER = LoggerFactory.getLogger(ObjectNullUtil.class); public static boolean objectIsNull(Object obj) { if (obj == null) { return true; } //獲取所有屬性 Field[] fields = obj.getClass().getDeclaredFields(); if (fields == null || fields.length == 0) { return true; } boolean flag = true; for (Field field : fields) { //不檢查,設置可訪問 field.setAccessible(true); try { if (field.get(obj) instanceof Collection) { if (isNotNull((Collection) field.get(obj))) { flag = false; break; } } else { if (isNotNull(field.get(obj))) { flag = false; break; } } } catch (Exception e) { LOGGER.error("ObjectNullUtil.objectIsNull校驗異常", e); flag = false; } } return flag; } public final static boolean isNull(Object obj) { if (obj == null || isNull(obj.toString())) { return true; } return false; } public final static boolean isNull(Collection collection) { if (collection == null || collection.size() == 0) return true; return false; } public final static boolean isNull(String str) { return str == null || "".equals(str.trim()) || "null".equals(str.toLowerCase()); } public final static boolean isNotNull(Collection collection) { return !isNull(collection); } public final static boolean isNotNull(Object obj) { return !isNull(obj); } }
1.目前判斷了Oject和Collection類型的,如果有其他的,比如Map屬性,那么就需要加上對Map的父類AbstractMap做判斷
2.沒有做嵌套的邏輯判斷,比如說有一個屬性List<Student>,如果new了一個Student加到list中,那么對外層的DTO判斷就是不為空的了,這塊如果也想判斷的話,還需要加強
