Java反射應(yīng)用(1)

何為反射:Java反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象屡穗,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制忽肛。

這句化很抽象村砂!那我們該如何理解這句話呢?

我們都知道Java所有的類的默認(rèn)繼承Object類屹逛,Object類提供了一個(gè)public final native Class<?> getClass() 的方法础废,也就是說任何一個(gè)對象在程序運(yùn)行期間都能知道他是那個(gè)類的實(shí)例。

不信我們寫段代碼來測試下:

運(yùn)行結(jié)果:


運(yùn)行結(jié)果說明我們確實(shí)可以在程序運(yùn)行期間獲取到該對象是那個(gè)類的實(shí)例罕模。

那我們再來看看Class類又提供了哪些方法:

乍一看好多啊色迂,那我們在平時(shí)的工作中到底該掌握哪些呢?

1手销、public T newInstance()? ?通過此方法可以調(diào)用類的默認(rèn)構(gòu)造器獲取一個(gè)類的實(shí)例

2歇僧、public Constructor?getConstructor(Class... parameterTypes) 通過此方法可以獲取類的一個(gè)構(gòu)造器

3、public Field[] getDeclaredFields() 通過此方法可以獲取到類中的所用屬性

4锋拖、public Method getMethod(String name, Class... parameterTypes) 根據(jù)方法名和參數(shù)類型來獲取方法诈悍。(為啥還需要參數(shù)類型,因?yàn)镴ava用方法重載機(jī)制)

5兽埃、public Method[] getMethods() 獲取類的所有方法

6侥钳、public native boolean isInstance(Object obj)? ?判斷對象是不是類的實(shí)例

7、public native boolean isInterface() 判斷類是不是接口類

8柄错、public native boolean isArray(); 判斷類是不是數(shù)組

還有很多方法我們就不一一介紹了舷夺,上面的這些方法只是我們在運(yùn)用反射時(shí)比較常用的。如果你有興趣了解可自行到官網(wǎng)查閱售貌。

下面重點(diǎn)來了给猾,我們?nèi)绾问褂眠@些方法呢。比如現(xiàn)在要讓你做一個(gè)業(yè)務(wù)場景颂跨,對一個(gè)方法傳過來的對象的所有屬性值做非空校驗(yàn)敢伸。但是需要保證方法的通用性。那我們就可以這么寫:

public static boolean checkProperty(Object object)throws Exception {

????//獲取所有屬性

? ? Field[] fields = object.getClass().getDeclaredFields();

? ? for (Field field : fields) {

????????if (field.get(object) !=null)return false;

? ? }

????return true;

}

這樣我們在不必知道一個(gè)需要檢驗(yàn)的類有哪些屬性恒削,只要他存在我們就能校驗(yàn).我門也不需要管它的這個(gè)屬性到底提供沒提供訪問方法池颈。是不是很強(qiáng)大尾序。

再比如說,我要寫一個(gè)Excel的導(dǎo)入功能躯砰。正常程序員都是對于不同的表格寫不同的方法來與之對應(yīng)的解析每币,那么能不能所有的解析操作用一個(gè)方法就能解決呢。那么答案是肯定的琢歇。

public static <T>? List<T>?getExcelData(Class<T> clazz, Workbook workbook) throws Exception {

????List list =new ArrayList<>();

? ? Field[] fields = clazz.getClass().getDeclaredFields();

? ? Sheet sheet = workbook.getSheet("要解析的表格");

? ? for (int i =0; i < sheet.getLastRowNum(); i++) {

? ? ? ? T object = clazz.newInstance();

? ? ? ? for (int j =0; j < fields.length; j++) {

????????fields[j].set(object, sheet.getRow(i).getCell(j));

? ? ? ? }

????????list.add(object);

? ? }

????return list;

}

上面的方法只是一個(gè)演示版本兰怠,很多細(xì)節(jié)都沒有考慮。但是你能感覺到反射所帶來的對一些規(guī)則性很強(qiáng)的業(yè)務(wù)可以做到很簡潔的實(shí)現(xiàn)矿微。我們不必對這些功能大致相同的東西都要費(fèi)心費(fèi)力的反復(fù)復(fù)制痕慢、粘貼尚揣,修改涌矢。大大提升了我們的工作效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末快骗,一起剝皮案震驚了整個(gè)濱河市娜庇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌方篮,老刑警劉巖名秀,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異藕溅,居然都是意外死亡匕得,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門巾表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汁掠,“玉大人,你說我怎么就攤上這事集币】稼澹” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵鞠苟,是天一觀的道長乞榨。 經(jīng)常有香客問我匪蟀,道長温自,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任号显,我火速辦了婚禮跨细,結(jié)果婚禮上态秧,老公的妹妹穿的比我還像新娘。我一直安慰自己扼鞋,他們只是感情好申鱼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布愤诱。 她就那樣靜靜地躺著,像睡著了一般捐友。 火紅的嫁衣襯著肌膚如雪淫半。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天匣砖,我揣著相機(jī)與錄音科吭,去河邊找鬼。 笑死猴鲫,一個(gè)胖子當(dāng)著我的面吹牛对人,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拂共,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼牺弄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宜狐?” 一聲冷哼從身側(cè)響起势告,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抚恒,沒想到半個(gè)月后咱台,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俭驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年回溺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片混萝。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遗遵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出譬圣,到底是詐尸還是另有隱情瓮恭,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布厘熟,位于F島的核電站屯蹦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏绳姨。R本人自食惡果不足惜登澜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飘庄。 院中可真熱鬧脑蠕,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晃跺,卻和暖如春揩局,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掀虎。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工凌盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹玉。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓驰怎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親二打。 傳聞我的和親對象是個(gè)殘疾皇子县忌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)址儒,斷路器芹枷,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 一衅疙、類的加載 (一) 定義及過程: 當(dāng)程序需要使用某個(gè)類的時(shí)候莲趣,如果這個(gè)類還沒有被加載到內(nèi)存中,則系統(tǒng)會(huì)通過加載饱溢、...
    VictorBXv閱讀 316評論 0 2
  • 《語芬》 我努力避開你喧伞, 卻在紛紛擾擾謝幕后, 找一條捷徑再回到你的身邊绩郎。 我到底是相貌如何得丑陋潘鲫, 恐懼得你不懂...
    野心要優(yōu)雅哦閱讀 180評論 0 0
  • 01責(zé)任 我們所承擔(dān)的責(zé)任,小到對父母肋杖、家庭溉仑,大到對社會(huì),但最根本的状植,是對自己的人生負(fù)責(zé)浊竟。 對自己負(fù)責(zé),才會(huì)主動(dòng)去...
    今夕_閱讀 116評論 0 2