java反射的作用 反射機(jī)制是在運(yùn)行時(shí),對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法。在java中,只要給定類的名字,就可以通過(guò)反射機(jī)制來(lái)獲得類的所有信息。 1)在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類。 2)在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象。 3)在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法。 4)在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法。 實(shí)現(xiàn)Java反射的類 1)Class:表示正在運(yùn)行的Java應(yīng)用程序中的類和接口。 注意: 所有獲取對(duì)象的信息都需要Class類來(lái)實(shí)現(xiàn)。 2)Field:提供有關(guān)類和接口的屬性信息,以及對(duì)它的動(dòng)態(tài)訪問(wèn)權(quán)限。 3)Constructor:提供關(guān)于類的單個(gè)構(gòu)造方法的信息以及它的訪問(wèn)權(quán)限。 4)Method:提供類或接口中某個(gè)方法的信息。 java反射機(jī)制 可以在運(yùn)行時(shí)判斷?個(gè)對(duì)象所屬的類,構(gòu)造?個(gè)類的對(duì)象,判斷類具有的成員變量和方法,調(diào)用1個(gè)對(duì)象的方法。 4個(gè)關(guān)鍵的類:Class,Constructor,F(xiàn)ield,Method。 getConstructor獲得構(gòu)造函數(shù)/getDeclardConstructor; getField/getFields/getDeclardFields獲得類所生命的所有字段; getMethod/getMethods/getDeclardMethod獲得類聲明的所有方法,正常方法是?個(gè)類創(chuàng)建對(duì)象,而反射是1個(gè)對(duì)象找到1個(gè)類。 如何通過(guò)反射獲取和設(shè)置對(duì)象私有字段的值? 可以通過(guò)類對(duì)象的 getDeclaredField()方法字段(Field)對(duì)象,然后再通過(guò)字段對(duì)象的 setAccessible(true)將其設(shè)置為可以訪問(wèn),接下來(lái)就可以通過(guò)get/set 方法來(lái)獲取/設(shè)置字段的值了。 如何通過(guò)反射創(chuàng)建對(duì)象? 方法 1:通過(guò)類對(duì)象調(diào)用 newInstance()方法,例如: String.class.newInstance() 方法 2:通過(guò)類對(duì)象的 getConstructor()或 getDeclaredConstructor()方法獲得構(gòu)造器(Constructor)對(duì)象并調(diào)用其newInstance()方法創(chuàng)建對(duì)象,例如:String.class.getConstructor(String.class).newInstance(“Hello”); 反射機(jī)制的優(yōu)缺點(diǎn) 優(yōu)點(diǎn): 1)能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例,提高靈活性; 2)與動(dòng)態(tài)編譯結(jié)合; 缺點(diǎn): 1)使用反射性能較低,需要解析字節(jié)碼,將內(nèi)存中的對(duì)象進(jìn)行解析。 解決方案: 1、通過(guò)setAccessible(true)關(guān)閉JDK的安全檢查來(lái)提升反射速度; 2、多次創(chuàng)建一個(gè)類的實(shí)例時(shí),有緩存會(huì)快很多; 3、ReflflectASM工具類,通過(guò)字節(jié)碼生成的方式加快反射速度; 反射機(jī)制的應(yīng)用場(chǎng)景有哪些? 反射是框架設(shè)計(jì)的靈魂。 在我們平時(shí)的項(xiàng)目開發(fā)過(guò)程中,基本上很少會(huì)直接使用到反射機(jī)制,但這不能說(shuō)明反射機(jī)制沒(méi)有用,實(shí)際上有很多設(shè)計(jì)、開發(fā)都與反射機(jī)制有關(guān),例如模塊化的開發(fā),通過(guò)反射去調(diào)用對(duì)應(yīng)的字節(jié)碼;動(dòng)態(tài)代理設(shè)計(jì)模式也采用了反射機(jī)制,還有我們?nèi)粘J褂玫?Spring/Hibernate 等框架也大量使用到了反射機(jī)制。 舉例: ①我們?cè)谑褂肑DBC連接數(shù)據(jù)庫(kù)時(shí)使用Class.forName()通過(guò)反射加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序; ②Spring框架也用到很多反射機(jī)制,最經(jīng)典的就是xml的配置模式。Spring 通過(guò)XML 配置模式裝載Bean 的過(guò)程: 1) 將程序內(nèi)所有 XML 或 Properties 配置文件加載入內(nèi)存中; 2)Java類里面解析xml或properties里面的內(nèi)容,得到對(duì)應(yīng)實(shí)體類的字節(jié)碼字符串以及相關(guān)的屬性信息; 3)使用反射機(jī)制,根據(jù)這個(gè)字符串獲得某個(gè)類的Class實(shí)例; 4)動(dòng)態(tài)配置實(shí)例的屬性; 小程序:IT面試題練習(xí) |
|
來(lái)自: IT樂(lè)知 > 《程序員的私房筆記》