1. 程式人生 > >物件通過反射轉為Map(物件中有多個物件)

物件通過反射轉為Map(物件中有多個物件)

    private static final String JAVAP = "java.";
    private static final String JAVADATESTR = "java.util.Date";

    /**
     * 利用遞迴呼叫將Object中的值全部進行獲取
     *
     * @param timeFormatStr 格式化時間字串預設<strong>2017-03-10 10:21</strong>
     * @param c             物件
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, String> objectToMapString(String timeFormatStr, Class<?> c, Object o) throws IllegalAccessException {
        Map<String, String> map = new HashMap<>();
        objectTransfer(timeFormatStr, c, o, map);
        return map;
    }


    /**
     * 遞迴呼叫函式
     *
     * @param timeFormatStr 時間格式
     * @param c             父類
     * @param o             key(父物件)
     * @param map           返回的map
     * @return
     * @throws IllegalAccessException
     */
    private static Map<String, String> objectTransfer(String timeFormatStr, Class<?> c, Object o, Map<String, String> map) throws IllegalAccessException {
        boolean isExclude = false;
        //預設字串
        String formatStr = "YYYY-MM-dd HH:mm:ss";
        //設定格式化字串
        if (timeFormatStr != null && !timeFormatStr.isEmpty()) {
            formatStr = timeFormatStr;
        }
        List<Field[]> flist = new ArrayList<>();
        flist.add(c.getDeclaredFields());
        flist.add(c.getSuperclass().getDeclaredFields());
        for (int i = 0; i < flist.size(); i++) {
            for (Field field : flist.get(i)) {
                field.setAccessible(true);
                String fieldName = field.getName();
                Object value = null;
                value = field.get(o);
                if (value != null) {
                    Class<?> valueClass = value.getClass();
                    if (valueClass.isPrimitive()) {
                        map.put(fieldName, value.toString());
                    } else if (valueClass.getName().contains(JAVAP)) {//判斷是不是基本型別
                        if (valueClass.getName().equals(JAVADATESTR)) {
                            //格式化Date型別
                            SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
                            Date date = (Date) value;
                            String dataStr = sdf.format(date);
                            map.put(fieldName, dataStr);
                        } else {
                            map.put(fieldName, value.toString());
                        }
                    } else {
                        //遞迴子物件 valueClass 子物件的class ,value 子物件
                        objectTransfer(timeFormatStr, valueClass, value, map);
                    }
                }
            }
        }
        return map;
    }

正在研究怎麼將Map賦值到物件中(物件中有多個子物件),糾結(ー`´ー)

相關推薦

物件通過反射轉為Map(物件物件)

private static final String JAVAP = "java."; private static final String JAVADATESTR = "java.util.Date"; /** * 利用遞迴呼叫將Ob

一個表單相同的欄位,以及springmvc接收相同物件問題

                                      &

陣列物件去重方式

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JQ去重</title> </head> <body> &l

建立一個數組,陣列物件

json.html<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>建立一個json格式陣列,

Java迴圈建立物件是幾引用?以及是否執行緒安全

在迴圈中,通過User user = new User();這種方式建立的物件。每次建立的物件是不同的,但是引用是同一個,引用的生命週期是單次迴圈,下次迴圈會覆蓋調上次的引用。 比如這段程式碼: int minId = 0; while (

form表單提交或者通過按鈕來提交時的跳轉方法

<form id="myForm"> <input id="btnId" value="提交" type="button"> </form> form表單一般是通過submit提交的,按鈕無法正常提交表單資料,就需要引用js函式來提交

當xlsxsheet,讀取其中一個sheet

以下讀取方法主要是自己認為比較簡單的方式 如果知道sheet_name,直接 import pandas as pd pd.read_excel(data_file,sheet_name) 獲取sheet_names的方法 import openpyxl wb = openpyxl.

請教C#對於介面複選框時如何處理的問題

// 指數 -- 當對陣列按各位進行排序時,exp=1;按十位進行排序時,exp=10;... int exp; // 陣列a中的最大值 int max = getMax(arr); // 從個位開始,對陣列a按"指數"進行排序 for (exp = 1;

解決html標籤空格

設計圖如下: 想著用如下程式碼: <div>引數 產地 功效</div> 雖然中間加了很多空格,但是實際效果就一個空格,想著有沒有空格標籤呢,最後發現只能用標籤符:“&nbsp;”&nbsp; 代表空格的轉意字元,如果有多

fragment巢狀viewpager,vierpagerfragment,不顯示 ...

現在好多應用流行一種佈局。底部幾個工具欄選項,上面也有類似tab的選項。 底部用RadioGroup控制fragment的切換。以上有五個fragment。 第一個fragment,代表著首頁。首頁又是一個類似tab的fragment,使用viewpager切換著兩

fragment巢狀viewpager,viewpagerfragment,裡面fragment沒有顯示

fragment巢狀fragment導致裡面fragment介面沒有顯示,例子如下: private void InitViewPager(View parentView) { mPag

fragment巢狀viewpager,vierpagerfragment,不顯示而且滑動卡頓

現在好多應用流行一種佈局。底部幾個工具欄選項,上面也有類似tab的選項。 底部用RadioGroup控制fragment的切換。以上有五個fragment。 第一個fragment,代表著首頁。首頁又是一個類似tab的fragment,使用viewpager切換著兩個fragment。  priv

ListViewItem(Item是edittext或則其他需要焦點的控制元件丟失焦點的問題)

ListView中有多個Item,Item中是edittext或則其他需要焦點的控制元件丟失焦點的問題.         發生這個的原因是因為,當點選item中的edittext的時候,軟鍵盤彈出來的時候,如果軟鍵盤會覆蓋到Item佈局,那麼就會造成ListView將會發生

edittext常用總結;介面edittext,如何讓預設第二獲取焦點

一個介面中多個edittext,預設第二個獲取焦點(第三個、第四個同理,其他view也同理) (1)預設第一個獲取鍵盤焦點,因此需要將第一個edittext設定為focusableInTo

函式return?C語言中,一個函式可以返回值?

      在移植wifi的程式碼時,遇到了一些與下面類似的函式,這些函式中有不只一個return,這可是個新鮮的玩意兒: int func (int b) { int a=5; if (a>b) return a; else

JDBC通過反射機制批量的把List裡面的物件新增到資料庫

1. 通過傳遞BOList,表名,sequence,還有一個表字段的陣列為引數,來完成資料的批量刪除       String[] columnNames = {"BIZ_CODE_ID","CODE_TYPE","CODE_NUM","CODE_VALUE",      

通過JDBC向oracle資料庫插入Clob大物件

好記性不如爛筆頭,今天剛剛學過Clob的插入和查詢,寫篇部落格,以備後用 首先建立一個包含大物件的表 create table data( id varchar2(20), content clob ); 然後通過JDBC連線資料庫並插入Clob

Java通過反射機制使用非預設構造器建立物件

1、Class類方法:getConstructors() 在JDK文件中,對於該方法有如下解釋: Returns an array containing Constructor objects re

TreeSet方法之一 當向TreeSet新增Person物件 續 當屬性值時的自然排序

package andycpp; public class Person implements Comparable { private String name; private Integer age; //get set 方法 public String ge

java 通過反射和自定義泛型來修改物件

public static <T> T Update(T beforeUpdate,T update){ try { if(beforeUpdate==null) return update; if(update==nul