Java反射機制獲取父類屬性

  • 今天由于業(yè)務(wù)需要,看一段數(shù)據(jù)庫中的表轉(zhuǎn)化成用戶可以看懂的數(shù)據(jù),也就是把一些字段比如Date用ms存的,轉(zhuǎn)化為'yyyy-MM-dd'這種格式,但是由于字段太多,所以利用Java反射機制自帶的BeanUtils相關(guān)的方法來進行轉(zhuǎn)化(要求兩個類的屬性名稱相同),當(dāng)然這個方法只支持基本數(shù)據(jù)類型,如Long,Integer,String,Short之類的轉(zhuǎn)化,但是像Date類型就需要自己手動判斷來轉(zhuǎn),這就出現(xiàn)了今天所遇到的坑

  • 先看下反射機制是如何獲取類的方法的:

    Class clazz = object.getClass();
    clazz.getDeclaredFields();
    clazz.getFields()
    

    ? 通過getClass()方法來獲取類的定義信息,通過定義信息再調(diào)用getFields()方法來獲取類的所有公共屬性,或者調(diào)用getDeclaredFields()方法來獲取類的所有屬性,包括公共,保護,私有,默認的方法,但是這里有一點要注意的是這個方法只能獲取當(dāng)前類里面顯示定義的屬性,不能獲取到父類或者父類的父類及更高層次的屬性的,所以我們要想獲取類的所有屬性,還要獲取父類的屬性:

    public static Field[] getAllFields(Object object){
      Class clazz = object.getClass();
      List<Field> fieldList = new ArrayList<>();
      while (clazz != null){
        fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
        clazz = clazz.getSuperclass();
      }
      Field[] fields = new Field[fieldList.size()];
      fieldList.toArray(fields);
      return fields;
    }
    

    ? 這個方法通過while循環(huán)及getSuperClass()方法獲取當(dāng)前類的父類再進行getDeclaredFields()即可,注意這個方法返回的是一個Field數(shù)組,然后如果我們想要把這些屬性拼接到一起,當(dāng)然是使用鏈表更方便一些,利用Arrays.asList()方法將數(shù)組轉(zhuǎn)化為鏈表,注意:這個方法返回的是一個List<>也就是抽象列表,所以要將其再用ArrayList初始化一次得到的列表才可變,否則得到的是一個不可變的列表.

    ? 然后我們再利用列表的toArray()方法將列表轉(zhuǎn)為數(shù)組,注意:這里又有一個坑,這個方法提供了兩種實現(xiàn):

    Object[] toArray();
    <T> T[] toArray(T[] a);
    

    ? 第一種無參,但注意,返回值類型為Object數(shù)組類型,直接這么寫肯定會報錯,但是如果強制轉(zhuǎn)換為需要的類型,則在運行時會拋這樣一個異常:

    異常信息

    ? 程序會告訴你無法這么轉(zhuǎn)換,所以這里要注意

    ? 第二種的參數(shù)就填你要轉(zhuǎn)換的數(shù)組就可以,但是他要求數(shù)組的長度是等于鏈表的長度的,否則會編譯不通過,所以得到鏈表之后在初始化數(shù)組即可

  • 然后這里在測試時導(dǎo)師提到了一個點就是循環(huán)依賴的問題,擔(dān)心while會跳不出來,但是這里其實跟屬性的具體類型是無關(guān)的,所以不會出現(xiàn)這個問題,但是就順便了解了下循環(huán)依賴的相關(guān)概念,比如我定義兩個類:

    class ClassA {
        int a;
        ClassB ab;
        public ClassA(){
            ab = new ClassB();
        }
    }
    class ClassB extends ClassA {
        int b;
        ClassA ba;
    
        public ClassB() {
            this.ba = new ClassA();
    }
    

    乍一眼看上去有很大問題嘛,怎么A是B的父類,A里面還有一個屬性是B類的,其實這個問題跟繼承關(guān)系也不大,只不過繼承關(guān)系會讓人印象更深刻,因為這段代碼編譯是可以通過的,那么我們來實例化一個B類看看會發(fā)生什么:

    異常信息

    接下來基本都是這樣的情況了,java拋出了棧溢出,從結(jié)果中也可以想出這個問題,即A的屬性引用了B類,而B的屬性又引用了A類,這使得在B類實例化時去初始化A,A又初始化B,就這么陷入了一個死循環(huán),最終導(dǎo)致程序棧溢出,所以我們在實際編碼過程中要千萬注意這種情形,如果發(fā)生在業(yè)務(wù)中,則是巨大的隱患存在.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末当窗,一起剝皮案震驚了整個濱河市夹纫,隨后出現(xiàn)的幾起案子纷铣,更是在濱河造成了極大的恐慌矢渊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躬审,死亡現(xiàn)場離奇詭異棘街,居然都是意外死亡,警方通過查閱死者的電腦和手機承边,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門遭殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人博助,你說我怎么就攤上這事险污。” “怎么了富岳?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵蛔糯,是天一觀的道長里伯。 經(jīng)常有香客問我,道長渤闷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任脖镀,我火速辦了婚禮飒箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒灰。我一直安慰自己弦蹂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布强窖。 她就那樣靜靜地躺著凸椿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翅溺。 梳的紋絲不亂的頭發(fā)上脑漫,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音咙崎,去河邊找鬼优幸。 笑死,一個胖子當(dāng)著我的面吹牛褪猛,可吹牛的內(nèi)容都是我干的网杆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼伊滋,長吁一口氣:“原來是場噩夢啊……” “哼碳却!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笑旺,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤昼浦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筒主,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座柱,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年物舒,在試婚紗的時候發(fā)現(xiàn)自己被綠了色洞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠胯,死狀恐怖火诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荠察,我是刑警寧澤置蜀,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布奈搜,位于F島的核電站,受9級特大地震影響盯荤,放射性物質(zhì)發(fā)生泄漏馋吗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一秋秤、第九天 我趴在偏房一處隱蔽的房頂上張望宏粤。 院中可真熱鬧,春花似錦灼卢、人聲如沸绍哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇堰。三九已至,卻和暖如春涩咖,著一層夾襖步出監(jiān)牢的瞬間海诲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工檩互, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饿肺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓盾似,卻偏偏與公主長得像敬辣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子零院,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • 一溉跃、注意點 面向?qū)ο蟮氖澜缰校f事萬物皆對象告抄。 Java中的類撰茎,是java.util.Class類的實例對象 類的...
    androidjp閱讀 2,360評論 0 9
  • 前言 多年以前自學(xué)Java,在本地做了一些筆記打洼。最近幾年流行播客龄糊,一方面防止丟失,一方面可以幫助其他小伙伴...
    chaohx閱讀 1,032評論 0 3
  • 一:java概述:1募疮,JDK:Java Development Kit炫惩,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • “看阿浓!人造太陽他嚷!”不知是誰喊了一聲。大家定睛一看,原來飛碟已經(jīng)隨著海水進入到了玻璃球殼罐內(nèi)的最里層筋蓖,透過海水和玻璃...
    渾水炊煙閱讀 275評論 0 2
  • 前言 隨手打開一個電商網(wǎng)站(如淘寶)卸耘,查看商品的時候, 把鼠標(biāo)放到圖片上都可以看到圖片的更多細節(jié)粘咖,像把圖片局部放大...
    jazenye閱讀 1,392評論 0 10