Java “反射”的樂趣,java反射樂趣
記得很久之前,就在一篇博文那裡看到說“反射”是Java的一大精華。當時還不懂,現在接觸的項目越來越多之後,才慢慢感受的反射的妙用。
反射是什嗎?
反射在java裡面指的就是反射機制了,在百度百科裡面:JAVA有著一個非常突出的動態相關機制:Reflection,用在Java身上指的是我們可以於運行時載入、探知、使用編譯期間完全未知的classes。換句話說,Java程式可以載入一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並產生其對象實體、或對其fields設值、或喚起其methods。
好吧,以前的我完全不知道這是人話。
我們先來理一下思路:我們大家都知道,Java從編寫到運行,肯定是要經過兩個時期的:編譯期,運行期,
上面加黑的兩句話就是說在編譯出Class檔案的時候,還可以不用確定是什麼類型的class。舉個栗子:就拿我之前的博文裡面提到的BaseDaoImpl<T>(詳細情況可看博文:http://blog.csdn.net/kklt21cn/article/details/42040597)
在編譯過後產生的class檔案裡面,是沒有對哪個實體類的對象的引用的,換句人話說就是在class檔案還沒有跑起來的時候都不知道要調用的是哪個實體。
但是,我們又要知道以後我們在運行時所調用的實體的名字,因為我們要知道名字,我們才能寫出它的hql語句。如何才能做到呢?答案就是反射啦!
其實,在java裡面,我們可以理解為class檔案,也是一種對象,這種對象就是類對象(class對象)。當我們能拿到class對象時,我們能通過class對象的反射,來運行它所有的方法(method),或者是獲得它的屬性(field)。這樣子,我們就可以在編寫代碼時候,不必在編譯期的時候就要確定類型,可以等到運行期的時候才確定了。
反射能做什嗎?
反射的用處其實在我們的日常代碼裡面無處不在的。比如我之前所說的BaseDaoImpl,可以減少大量的冗餘代碼,再比如說架構裡面的組件,例如:ommons-lang.jar。裡面一個我比較喜歡使用的一個工具類BeanUtils,其中裡面的一個賦值的方法copyProperties(Object source ,Object target)。裡面就是用了反射來把一個javaBean的值賦給另一個JavaBean。還有利用反射,可以來完成註解。如果對註解感興趣的童鞋可以看看這個連結http://www.zhihu.com/question/24401191。裡面的第一個回答,有大牛已經從底層解釋了如何?的了。
其實反射只是Java語言的特性之一而已。我個人是感覺慢慢理解這些進階的特性,才算是對一門語言入了門。也能從語言設計的角度,去思考一門語言的價值。只有這樣,才能算是一個真正的工程師,而不僅僅是一個只會複製黏貼的碼農!
若有紕漏,歡迎指正。