通過java反射,遞迴查詢物件所有屬性,為空也要返回欄位的結構

liuxianwen1990發表於2020-12-01
//TODO 這樣要注意,entity是檔名稱,要換成你自己實體類上的檔名,如:com.greatmap.internet.estate.entity
package com.greatmap.internet.estate.utils;

import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author lxw
 * @date 2020/11/30 18:08
 */
public class ObjectToJosn {

    public static String Object2JsonAllFiled(Object object){
        return JSONObject.toJSONString(getAllFiledName(object));
    }


    /**
     * @param model
     * @return
     */
    public static Object getAllFiledName(Object model) {
        Field[] field = model.getClass().getDeclaredFields(); // 獲取實體類的所有屬性,返回Field陣列
        try {
            for (int j = 0; j < field.length; j++) {  // 遍歷所有屬性
                String name = field[j].getName(); // 獲取屬性的名字
                name = name.substring(0, 1).toUpperCase() + name.substring(1); // 將屬性的首字元大寫,方便構造get,set方法
                String type = field[j].getGenericType().toString(); // 獲取屬性的型別
                if (type.equals("class java.lang.String")) { // 如果type是類型別,則前面包含"class ",後面跟類名
                    Method m = model.getClass().getMethod("get" + name);
                    String value = (String) m.invoke(model); // 呼叫getter方法獲取屬性值
                    if (value == null) {
                        m = model.getClass().getMethod("set" + name, String.class);
                        m.invoke(model, "");
                    }
                }
                if (type.equals("class java.lang.Integer")) {
                    Method m = model.getClass().getMethod("get" + name);
                    Integer value = (Integer) m.invoke(model);
                    if (value == null) {
                        m = model.getClass().getMethod("set" + name, Integer.class);
                        m.invoke(model, 0);
                    }
                }
                if (type.equals("class java.lang.Boolean")) {
                    Method m = model.getClass().getMethod("get" + name);
                    Boolean value = (Boolean) m.invoke(model);
                    if (value == null) {
                        m = model.getClass().getMethod("set" + name, Boolean.class);
                        m.invoke(model, false);
                    }
                }
                if (type.equals("class java.util.Date")) {
                    Method m = model.getClass().getMethod("get" + name);
                    Date value = (Date) m.invoke(model);
                    if (value == null) {
                        m = model.getClass().getMethod("set" + name, Date.class);
                        //格式化日期
                        m.invoke(model,new Date() );
                    }
                }
                if (type.contains("List")) {
                    Method m = model.getClass().getMethod("get" + name);
                    List list = (List) m.invoke(model);
                    if (null == list) {
                        m = model.getClass().getMethod("set" + name, List.class);
                        m.invoke(model, new ArrayList<>());
                    }else {
                       //如果是集合中只有一部分有值,其他屬於都要顯示
                        for(int i=0;i<list.size();i++){
                            getAllFiledName(list.get(i));
                        }
                    }
                }
                //如果是物件,就要遞迴遍歷物件,這裡對接智慧用關鍵字來看,物件陣列不接受
                //TODO 這樣要注意,entity是檔名稱,要換成你自己實體類上的檔名,如:com.greatmap.internet.estate.entity
                if (type.contains("com.greatmap.internet.estate.entity")&&!type.contains("List")) {
                    //這裡是遞迴查詢,如果物件相互引用,就會導致死迴圈
                    Method m = model.getClass().getMethod("get" + name);
                    Object value =  m.invoke(model);
                    if(null==value){
                        try {
                          Object obj=  Class.forName(type).newInstance();
                            getAllFiledName(obj);
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        } catch (InstantiationException e) {
                            e.printStackTrace();
                        }
                    }else {
                        getAllFiledName(value);
                    }
                }

                // 如果有需要,可以仿照上面繼續進行擴充,再增加對其它型別的判斷
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return model;
    }

    public static String getSystemYYYYMMDD(){
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設定日期格式
        return  df.format(new Date());
    }


}

相關文章