#反射是啥?
反射既然有“反”,就表示它是逆向的過程。那我們先來看看正向過程是怎麼樣的。
設計一個類,類別實例化成對象,對象調方法或屬性去實作一些功能。
那反射是什麼呢?
我不知道大家是否還記得上圖,這是剛接觸java時學到的知識。我自己的理解是現在是知道1,反推到2,然後再透過2得到一些別的資訊。 (這只是我的推測,至於具體是不是,還需日後深究)
類比到現實中的場景是:
你:妈妈,你知道剪刀在哪吗? 妈妈:我那天放针线的时候好像在针线盒里看到了,你去找找有没有。针线盒在客厅的茶几上。 你:好的。
然後你從「針線」推導出了「針線盒”,再從“針線盒”中找到了“剪刀”。
我們的反射是:從類別或物件推導出Class類,然後再從Class類別中獲得類別的資訊。
更迷糊了?不急,請往下看。
找到針線盒-取得Class類別
#先開始說Class類別是什麼?
Class類別就是People類別的類,就像People類別是p的類別一樣。 Class類是p的「爺爺」。
我們可以這樣理解:java.lang.Class的實例物件是People,People的實例物件是p。我們的想法就是透過People類別或p物件取得Class類,然後再透過Class類取得People類別的信息,例如屬性,方法,建構子等等。
知道了Class類別是什麼,那我們說怎麼才能取得它。
找到Class類別有3種方法:
值得一提的是,c1、c2、c3叫做People類別的「類別類型」。好了,現在我們總結已知條件:
People:類別
p:物件
#c:類別類型
找到剪刀-取得People類別的資訊
#應用程式一:取得類別的全部方法
在取得People類別的方法中,ms是存放著People類別方法的數組,透過循環,一層層會取得它的名稱、參數類型、傳回值。
最後直接在main函數中呼叫即可
得到的部分結果如下:
#應用二:取得類別的全部屬性
#呼叫與呼叫方法類似:
#運行結果:
應用三:取得類別的建構子
建構子類似,不再贅述。
######應用四:取得類別的某個特定方法#####################運行結果如下,兩種呼叫方式結果相同:
以上只是個別功能的列舉,更具體的可以去API文件中尋找:http:/ /tool.oschina.net/apidocs/apidoc?api=jdk-zh
反射的概念
在文章的最後,我們總結一下反射的概念,讓思想昇華一下。
反射的定義是什麼?
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類別的所有屬性和方法;對於任意一個對象,都能夠呼叫它的任意一個方法,這種動態擷取、呼叫物件方法的功能稱為java語言的反射機制。
反射存在的必要性?
「反射機制是許多java框架的基石」。
(1)在xml檔案或properties裡面寫好了配置,然後在Java類別裡面解析xml或properties裡面的內容,得到一個字串,然後用反射機制,根據這個字串獲得某個類別的Class實例,這樣就可以動態配置一些東西,不用每一次都要在程式碼裡面去new或者做其他的事情,以後要改的話直接改配置文件,程式碼維護起來就很方便了。
(2)有時候要適應某些需求,Java類別裡面不一定能直接呼叫另外的方法,這時候也可以透過反射機制來實現。
反射的缺點?
我們也能在程式碼中看到,反射的程式碼比正常呼叫的程式碼更多,效能也慢,所以應避免使用反射。這就等於如果你本來就知道剪刀在哪,就沒必要再通過針線——針線盒——剪刀這條路了。
是否使用反射的標準是啥?
如果一個功能可以不用反射完成,那麼最好就不用。
php中文網,大量的免費Java入門教學,歡迎線上學習!
以上是什麼是java反射的詳細內容。更多資訊請關注PHP中文網其他相關文章!