JavaBean轉(zhuǎn)Map

通過反射獲取對象(Object)的所有屬性的名稱以及數(shù)值,放入Map裆站。
可以直接循環(huán)添加到Http請求中条辟,作為Get請求的參數(shù)拼接。
如代碼所示宏胯,調(diào)用getParamsMap(Object obj)即可獲取到obj的屬性Map(鍵值對)羽嫡。

    private static Map<String, String> getMap(Object obj, Class<?> cls, String np) {
        Map<String, String> maps = new HashMap<>();
        if (null != cls.getSuperclass() && Object.class != cls.getSuperclass()) {
            Map<String, String> mapsSuper = getMap(obj, cls.getSuperclass(), np);
            if (null != mapsSuper && !mapsSuper.isEmpty())
                maps.putAll(mapsSuper);
        }
        try {
            Field[] fields = cls.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);// 設(shè)置訪問權(quán)限
                if (Modifier.isTransient(field.getModifiers())) {// 是否有transient修飾符,有的話忽略該屬性
                    continue;
                }
                String name = field.getName();// 屬性名稱
                if (name.equalsIgnoreCase("this$0") || name.equalsIgnoreCase("serialVersionUID")) {
                    continue;// 內(nèi)部類有this$0這個默認(rèn)屬性指向外部類肩袍,serialVersionUID不需要
                }
                if (field.isAnnotationPresent(SerializedName.class)) {
                    name = field.getAnnotation(SerializedName.class).value();
                }
                String key = null == np ? name : np + '[' + name + ']';
                Class<?> type = field.getType();
                if (type.isPrimitive()) {// 基本類型
                    Object value = field.get(obj);// 獲取屬性值杭棵,需要從源對象中獲取
                    maps.put(key, null == value ? "" : value.toString());
                    continue;
                }
                Object value = field.get(obj);// 獲取屬性值,需要從源對象中獲取
                if (null == value) {
                    continue;
                }
                if (value.getClass().isArray()) {// 屬性是數(shù)組類型
                    int length = Array.getLength(value);
                    for (int i = 0; i < length; i++) {
                        Object objItem = Array.get(value, i);
                        Map<String, String> mapItem = getMap(objItem, objItem.getClass(), key + '[' + i + ']');
                        if (null != mapItem && !mapItem.isEmpty())
                            maps.putAll(mapItem);
                    }
                    continue;
                }
                if (value instanceof List) {// 屬性是List類型
                    List<Object> p = (List) value;
                    for (int i = 0; i < p.size(); i++) {
                        Object objItem = p.get(i);
                        Map<String, String> mapItem = getMap(objItem, objItem.getClass(), key + '[' + i + ']');
                        if (null != mapItem && !mapItem.isEmpty())
                            maps.putAll(mapItem);
                    }
                    continue;
                }
                if (value instanceof Map) {// 屬性是Map類型
                    Map<Object, Object> p = (Map) value;
                    for (Map.Entry entry : p.entrySet()) {
                        String tn = entry.getValue().getClass().getName();// 判斷Map的Value對象類型了牛,基礎(chǔ)類型直接加入Maps
                        if (tn.startsWith("java.lang.")) {
                            if ("java.lang.Object".equals(tn)) {
                                Map<String, String> mapField = getMap(entry.getValue(), entry.getValue().getClass(), key + '[' + entry.getKey() + ']');
                                if (null != mapField && !mapField.isEmpty())
                                    maps.putAll(mapField);
                                continue;
                            }
                            maps.put(key + '[' + entry.getKey() + ']', null == entry.getValue() ? "" : entry.getValue().toString());
                            continue;
                        }
                        Map<String, String> mapItem = getMap(entry.getValue(), entry.getValue().getClass(), key + '[' + entry.getKey() + ']');
                        if (null != mapItem && !mapItem.isEmpty())
                            maps.putAll(mapItem);
                    }
                    continue;
                }
                if (type.getName().startsWith("java.lang.")) {// 基本類型封裝類颜屠,String
                    if ("java.lang.Object".equals(type.getName())) {
                        Map<String, String> mapField = getMap(value, value.getClass(), key);
                        if (null != mapField && !mapField.isEmpty())
                            maps.putAll(mapField);
                        continue;
                    }
                    maps.put(key, null == value ? "" : value.toString());
                    continue;
                }
                if (type.getName().equals("java.util.Date")) {// 日期時間類型
                    // TODO 日期時間類型需要自定義格式
                    maps.put(key, value.toString());
                    continue;
                }
                Map<String, String> mapField = getMap(value, value.getClass(), key);// 屬性是自定義類型
                if (null != mapField && !mapField.isEmpty())
                    maps.putAll(mapField);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return maps;
    }

    public static Map<String, String> getParamsMap(Object obj) {
        if (null == obj) {
            return null;
        }
        Map<String, String> map = getMap(obj, obj.getClass(), null);
        return map;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辰妙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甫窟,更是在濱河造成了極大的恐慌密浑,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粗井,死亡現(xiàn)場離奇詭異尔破,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浇衬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門懒构,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耘擂,你說我怎么就攤上這事胆剧。” “怎么了醉冤?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵秩霍,是天一觀的道長。 經(jīng)常有香客問我蚁阳,道長铃绒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任螺捐,我火速辦了婚禮颠悬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘定血。我一直安慰自己赔癌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布糠悼。 她就那樣靜靜地躺著届榄,像睡著了一般浅乔。 火紅的嫁衣襯著肌膚如雪倔喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天靖苇,我揣著相機(jī)與錄音席噩,去河邊找鬼。 笑死贤壁,一個胖子當(dāng)著我的面吹牛悼枢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脾拆,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼馒索,長吁一口氣:“原來是場噩夢啊……” “哼莹妒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绰上,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤旨怠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜈块,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鉴腻,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年百揭,在試婚紗的時候發(fā)現(xiàn)自己被綠了爽哎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡器一,死狀恐怖课锌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祈秕,我是刑警寧澤产镐,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站踢步,受9級特大地震影響癣亚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜获印,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一述雾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兼丰,春花似錦玻孟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艳丛,卻和暖如春匣掸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氮双。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工碰酝, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戴差。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓送爸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袭厂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一:java概述:1墨吓,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境纹磺,java的開發(fā)工...
    ZaneInTheSun閱讀 2,629評論 0 11
  • 偶爾靜下來的時候肛真,會粗略地回顧過去發(fā)生的事情。很快就會發(fā)現(xiàn)2016年開始后爽航,工作生活感情各方面看起來好像都好忙蚓让,好...
    此處有大莫閱讀 201評論 0 0
  • 都說“婚姻是愛情的墳?zāi)埂保@墳難道不是你自己挖的嗎讥珍? 戀愛時历极,你就知道這個男人貪玩且貪杯,不務(wù)正業(yè)衷佃,...
    Amobling閱讀 286評論 1 0
  • 昨天我寫的文章被轉(zhuǎn)入了“僅自己可見”趟卸。仔細(xì)閱讀后發(fā)現(xiàn),文章太不嚴(yán)謹(jǐn)氏义。以后自己得更加縝密锄列,而不能隨意。 心情...
    簡心譯閱讀 234評論 0 1
  • 臘月二十四凌晨兩點十六分七斤二兩的小妹到來了惯悠。 預(yù)產(chǎn)期按時到來邻邮,沒有提前沒有延后,給力的小妹克婶,羊水雖然...
    閑山靜水閱讀 192評論 0 0