一、什么是反射?
對(duì)于程序員來(lái)說(shuō),應(yīng)該很少需要直接使用反射工具;之所以在語(yǔ)言中提供它們,是為了支持其他Java特性,比如對(duì)象序列化、JavaBeans以及RMI。還有就是在很多框架中,也是應(yīng)用到了反射機(jī)制。
在初學(xué)時(shí),只知道這是個(gè)生成驅(qū)動(dòng)實(shí)例的語(yǔ)句,而這其實(shí)就是應(yīng)用了反射
二、反射能做什么?
主要的四個(gè)功能:
-獲取對(duì)象所屬的類
-獲取類的成員變量、方法
-運(yùn)行時(shí)創(chuàng)建對(duì)象
-運(yùn)行時(shí)調(diào)用對(duì)象的方法
其它功能
可用構(gòu)建器創(chuàng)建新對(duì)象,通過(guò)Constructor類取得其它類的構(gòu)造函數(shù)
用get()和set()方法讀取和修改與Field對(duì)象關(guān)聯(lián)的字段
用invoke()方法調(diào)用與Method對(duì)象關(guān)聯(lián)的方法,即調(diào)用其他類的方法
此外,我們可調(diào)用方法getFields(),getMethods(),getConstructors(),分別返回用于表示字段、方法以及構(gòu)建器的對(duì)象數(shù)組,取得并修改數(shù)組的信息
取得其他類的父類、實(shí)現(xiàn)的接口、權(quán)限修飾符、屬性類型等
三、反射的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):可以實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建對(duì)象,增加程序的靈活性。這種靈活性怎么體現(xiàn)的呢?比如我們?cè)陂_(kāi)發(fā)一個(gè)大型的軟件,編譯發(fā)布后,我們很可能需要更新一些功能,但因?yàn)檐浖寻l(fā)布,我們肯定不能要求用戶把以前的卸載,再重新安裝新的版本。如果我們采用靜態(tài)的解決方法的話,需要重新編譯整個(gè)程序,而如果采用反射機(jī)制的話,就可以不用卸載,只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)建和編譯,就可以實(shí)現(xiàn)更新的功能。
缺點(diǎn):
性能影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。
破壞封裝,因?yàn)橥ㄟ^(guò)反射可以訪問(wèn)私有變量或方法,這樣可能會(huì)存在安全性的問(wèn)題。比如我們知道String是不可變的,因?yàn)檫@個(gè)類被final修飾說(shuō)明不可繼承,并且String其實(shí)就是被final修飾的一個(gè)字符數(shù)組value,value是private的,但是通過(guò)反射是可以訪問(wèn)到private成員變量,因此通過(guò)反射,我們其實(shí)是可以改變String的,很明顯,這樣是不安全的。
以上就是北大青鳥(niǎo)長(zhǎng)沙麓谷校區(qū)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):Java反射機(jī)制”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。