您好,登錄后才能下訂單哦!
java反射是怎么實現的?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
反射是啥?
反射既然有“反”,就說明它是一個逆向的過程。那我們先來看看正向過程是怎樣的。
設計一個類,類實例化成對象,對象調方法或屬性去實現一些功能。
那反射是什么呢?
不知道大家是否還記得上圖,這是剛接觸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類里面不一定能直接調用另外的方法,這時候也可以通過反射機制來實現。
反射的缺點?
我們在代碼中也能看到,反射的代碼比正常調用的代碼更多,性能也慢,所以應避免使用反射。這就相當于如果你本來就知道剪刀在哪,就沒必要再通過針線——針線盒——剪刀這條路了。
是否使用反射的標準是啥?
如果一個功能可以不用反射完成,那么最好就不用。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。