今天由于業(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ù)中,則是巨大的隱患存在.
Java反射機制獲取父類屬性
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門遭殉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人博助,你說我怎么就攤上這事险污。” “怎么了富岳?”我有些...
- 文/不壞的土叔 我叫張陵蛔糯,是天一觀的道長里伯。 經(jīng)常有香客問我,道長渤闷,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任脖镀,我火速辦了婚禮飒箭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒灰。我一直安慰自己弦蹂,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布强窖。 她就那樣靜靜地躺著凸椿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翅溺。 梳的紋絲不亂的頭發(fā)上脑漫,一...
- 文/蒼蘭香墨 我猛地睜開眼伊滋,長吁一口氣:“原來是場噩夢啊……” “哼碳却!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笑旺,我...
- 正文 年R本政府宣布奈搜,位于F島的核電站,受9級特大地震影響盯荤,放射性物質(zhì)發(fā)生泄漏馋吗。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一秋秤、第九天 我趴在偏房一處隱蔽的房頂上張望宏粤。 院中可真熱鬧,春花似錦灼卢、人聲如沸绍哎。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽崇堰。三九已至,卻和暖如春涩咖,著一層夾襖步出監(jiān)牢的瞬間海诲,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 一溉跃、注意點 面向?qū)ο蟮氖澜缰校f事萬物皆對象告抄。 Java中的類撰茎,是java.util.Class類的實例對象 類的...
- 前言 多年以前自學(xué)Java,在本地做了一些筆記打洼。最近幾年流行播客龄糊,一方面防止丟失,一方面可以幫助其他小伙伴...
- 一:java概述:1募疮,JDK:Java Development Kit炫惩,java的開發(fā)和運行環(huán)境,java的開發(fā)工...