需求:有一個vo類,該類繼承了一個實體類,獲取到vo對象後,需要將其中的null值轉為空字元串; 思路:傳入參數,用Object接收,利用反射獲取到該對象的所有欄位,並判斷置空; 由於一開始沒有考慮到父類的欄位獲取,導致時不時出現錯誤,因此這裡簡單記錄一下。 // 無需返回object,set後對象 ...
需求:有一個vo類,該類繼承了一個實體類,獲取到vo對象後,需要將其中的null值轉為空字元串;
思路:傳入參數,用Object接收,利用反射獲取到該對象的所有欄位,並判斷置空;
由於一開始沒有考慮到父類的欄位獲取,導致時不時出現錯誤,因此這裡簡單記錄一下。
// 無需返回object,set後對象內的值就已經修改了
public static void setNullToEmpty(Object object){
Class<?> clazz = object.getClass();
Field[] fields = getAllFields(clazz);
for (Field field : fields) {
// 這裡只處理類型為string的
if (field.getType().equals(String.class)) {
// get和set前都需要賦予訪問許可權
field.setAccessible(true);
if (field.get(object) == null) {
DataUtil.setValue(object, field);
}
}
}
}
/**
* 設置新值
*
*
*/
public static void setValue(Object object, Field field) {
try{
Class<?> clazz = object.getClass();
field.setAccessible(true);
// 當前對象是否屬於子類
if (field.getDeclaringClass() == clazz) {
field.set(object, "newValue");
} else {
Field parentField = clazz.getSuperclass().getDeclaredField(field.getName());
parentField.setAccessible(true);
parentField.set(object, "newValue");
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 獲取當前類及其父類的所有欄位信息
* @param clazz
* @return
*/
public static Field[] getAllFields(Class<?> clazz) {
Field[] allFields = clazz.getDeclaredFields(); // 獲取當前類的所有欄位
Class<?> superClass = clazz.getSuperclass();
// 若存在父類 則獲取父類信息
if (superClass != null) {
allFields = concatenate(getAllFields(superClass), allFields);
}
return allFields;
}
/**
* 合併子類 + 父類
* @param parent
* @param child
* @return
*/
public static Field[] concatenate(Field[] parent, Field[] child) {
int parentLen = parent.length;
int childLen = child.length;
Field[] c= new Field[parentLen+childLen];
System.arraycopy(parent, 0, c, 0, parentLen);
System.arraycopy(child, 0, c, parentLen, childLen);
return c;
}