標籤:
Java的反射機制是Java語言很重要的一個特性,先從Sun官網上看一下官網是如何定義反射機制的。
大致翻譯一下,翻譯的可能不是很準確。反射(Reflection)是Java程式設計語言的一個特性,它要求Java程式啟動並執行時候檢查或自檢,並且對內部的屬性進行操作。例如,它可以讓一個Java類獲得它自己所有的成員名稱並且顯示出來。這種能夠從一個Java類內部進行檢查和操作的能力聽起來可能不是很受喜歡,但是在其他程式語言中這種特性(功能)根本就不存在。例如,對於Pascla、C或者C#程式就沒有辦法來獲得其內定義的函數。另一個實實在在存在的反射的例子就是在JavaBeans中,軟體組件可以通過構造器來操作。這個構造器就是利用反射來獲得Java的屬性(類)因為它們是動態載入的。
換句話,通俗一點來理解Java的反射機制,就是在運行狀態下,對於任意一個類都能動態獲得其類下的屬性和方法,對於任意一個對象都能夠調用它的任意一個方法。這種動態擷取資訊和動態調用對象的方法的功能稱為Java的反射機制,而且這種機制是Java語言所特有的的,是別的程式設計語言所不具備的。
現在很多開源架構都使用反射機制,像Hibernate、Struts都是利用反射機制來實現的。但是我們為什麼要用反射機制呢?想想我們以往是如何?的,在編譯的時候確定一個類型,比如一個類或者一個對象,都是寫死的,固定寫好,然後執行個體化對象或者去調用某個方法,這種方式叫做靜態編譯。那麼與之對應的就是動態編譯了,也就是我們這篇部落格講的Java反射,它的實現原理是在啟動並執行時候再確定類型,然後綁定對象。這種動態編譯的特性極大限度的發揮了Java語言的強大功效,增強了Java的靈活性,體現了多態的應用。
如果上面那麼說你還不能理解,那就換種方式。Java的反射就是指在程式運行時能夠擷取自身的資訊,在Java中只要給定類的名字,那麼就可以通過反射機制來擷取類的所有資訊。想想我們在OA時運用的反射機制因為不確定傳進來是哪個實體,是Role還是Apartment還是User,就利用Java的反射機制Class<T>,仔細回憶一下當時的情景。就是我們有三張表,Role、Apartment和User,每個表都有增刪改查四個操作,我們之前不懂Java反射機制的時候,可能就得根據不同的表建立不同的Dao類,像我們上面,就得建立三個Dao類,裡面大量重複相同的方法,只是類名不一樣。
現在有了Java的反射機制,我們就得從原來的的老圈子裡跳出來。想想人類真是聰明,開發出工具也就算了,還想著不斷改進怎麼能複用性高、效率高。所以我們現在用Java的反射機制,只建立一個Dao類,然後把增刪改查的方法寫進去,但是把類型空出來,到時候只要傳入不同類型的對象就可以操作了,無需有多少表就建立多少個Dao類,反射機制會自動幫我們做這件事。就好比有個酒窖有三個酒缸,分別裝著藍酒、綠酒和黃酒,酒窖老闆每天在門口擺一種酒缸放在門口賣酒。以前的做法就是:比如今天賣藍酒,就搬著裝藍酒的酒缸放在門口;買綠酒就搬著綠酒的酒缸到門口。後來一個夥計想了一個辦法,就是在門口放一個空酒缸,安一個龍頭在酒缸上,今天想賣什麼酒直接往門口的酒缸裡面注就行了,這樣就不用來回搬著酒缸了。呵呵,多麼笨的老闆,當然這個故事是我杜撰的,目的只是想講明白Java的反射機制.
所以回過頭來說,Java的反射機制可以實現動態建立對象和編譯,為了更好的理解,我們再來杜撰一個例子。現在我是一個班主任,我以前是這麼分配工作的,小紅負責掃地;小藍負責擦玻璃;小黑負責擦黑板;小黃負責倒垃圾,每個人只負責自己的工作,我看到地沒掃,就得記著安排小紅去掃地......
但是這樣分配工作效率很低,因為我每每想著要安排一個工作,就得想著安排哪個固定的人員去做這件事。所以有了Java反射機制之後,我更改了以往的安排工作的方式。
這樣一來,利用Java的反射機制,你也不知道你要new哪個對象去做什麼工作,原來直接建立對象去執行相應的工作,現在利用Java的反射機制,在程式啟動並執行過程中,動態建立對象然後去調用它的任意一個方法和屬性去執行其職能。不知道這樣講你對Java的反射機制明白了沒有?下篇文章我會介紹通過Java的反射機制讀取Jar包的類名和屬性,敬請期待吧!
【動態網頁面】(二)Java反射