java的反射到底是有什么用處?怎么用?
首先,明白靜態(tài)語言與動(dòng)態(tài)語言的區(qū)別
Java是一門靜態(tài)語言,但是反射提供了一種黑魔法,允許在運(yùn)行時(shí)去動(dòng)態(tài)修改一個(gè)類的定義,一個(gè)對象的屬性等等,給靜態(tài)語言加上了“動(dòng)態(tài)”的效果
Java反射可以簡單的理解為Class的一種抽象,我們知道,Java是面向?qū)ο笳Z言,一切皆對象,都是某種抽象,可以理解反射就是對Class的抽象,所以,通過反射,你可以獲取類名,注解,屬性,構(gòu)造器,gettter/setter等等,動(dòng)態(tài)調(diào)用方法,修改屬性,修改屬性的訪問權(quán)限等等
Java反射的應(yīng)用很多,如,JSON的序列化/反序列化,JDK動(dòng)態(tài)代理,AOP等等
這樣會(huì)讓java在編寫的時(shí)候不容易出錯(cuò),但也會(huì)對一些東西形成阻礙,尤其是一些相互之間沒有關(guān)系的那種,例如,我想通過一個(gè)靜態(tài)方法,把類型A的對象a,他的一些字段復(fù)制給類型B的對象b的同名同類型字段上面,而A和B沒有關(guān)系,他們可以是任何類。
你看,這樣的話我們無法直接通過A和B的get和set方法來讀寫這些字段吧?因?yàn)锳和B沒有任何關(guān)系,他們在這個(gè)方法的參數(shù)中,只能是Object類型,而對一個(gè)未知類型的對象進(jìn)行操作,反射就是必不可少的了。
對未知類型的對象或僅僅知道該對象實(shí)現(xiàn)的接口,抽象類的而不知道具體類型的時(shí)候 我們可以使用反射完成對他的操作。
上面這個(gè)例子就是BeanUtils里面的一個(gè)方法:copyProperties,它能夠?qū)⒁粋€(gè)對象的內(nèi)容復(fù)制到另一個(gè)對象里面。
那么像這種通用的方法,不局限于某一個(gè)類或者某一個(gè)對象,很大幾率都是通過反射做到的。
除此之外,反射還有更加廣泛的用途。
在java中,能夠控制應(yīng)用的一部分,或者整體的啟動(dòng)和關(guān)閉,需要你編程來配合它的工作,那么這種類庫應(yīng)該被稱作框架,一個(gè)很著名的框架是spring,spring可以自己根據(jù)你的配置自動(dòng)的創(chuàng)建各種類的對象,能夠自動(dòng)調(diào)用他們的set方法,甚至不通過set方法來設(shè)置字段的值,而這都是通過反射做到的,因此你可以在spring中使用任何類和對象,只要配置正確,它都能被spring納入管理范圍。
WRITE-BUG研發(fā)團(tuán)隊(duì)衷心希望【W(wǎng)RITE-BUG數(shù)字空間】可以給每位同學(xué)一個(gè)屬于自己的秘密空間,同時(shí)祝愿大家在“公開圈子”世界里,遇見志同道合的伙伴們,因?yàn)槲覀兣c大家一樣,都曾孤獨(dú)前行著。


