反射實現了在程序運行時動態編譯生存對象的一種機制。這個機制依賴對JAVA的類的一種抽象——即Class類。與Class類聯繫的其它類Method類、Field類、Constructor類、Modifier類等代表各種信息的類。書裏面說,反射是在運行時通過獲得運行對像的類信息,即Class對象,從而運行Class對象信息進行動態地操作。而在運行時對像的信息可以在編譯的時候就知道的,那叫做RTTI,而反射是在運行時對對象的信息是沒有預先知道的,而是通過獲取對象類信息關聯的類名,動態加載所需的類對象,以類對象進行各種的操作。甚至通過動態編譯,生成類的字節碼數組,再通過ClassLoader加載類對象。獲得類對象之後,我們就可以用它生存各種Method對象、Field對象、Constructor對象、Modifier對象進行各種操作。反射,給我們帶了新的一種編程方式,因爲我們擁有了代表程序運行所需的對象的信息,在編寫程序時,我們可以用Class類、Method類、Field類、Constructor類等這些類的實例去代表程序所需的對象、方法、屬性。我們選擇不選擇顯式地創建對象,可以選擇不顯式地調用方法,而用Class返回我們所需要的方法對象,用方法對象的invoke()方法,得到與顯式調用方法一樣的效果。因爲以上這些類在是類的抽象、是方法的抽象、是字段的抽象,這些都是符號代表,代表着其可以在編程過程中更好地隱藏實現,就拿Method來說,invoke()方法代表着方法的調用。相對於顯式調用來說,其靈活性大大增強,因爲它只是代表方法的執行,對於執行怎樣的方法,方法名是什麼,參數是什麼,這些都隱藏在背後的實現裏,它只是一個執行的楷架。而顯示調用方法,就已經確定了這個方法一定是某個對象的某個方法,儘管方法實現內容是可以改變,但是方法名就不能改變了。在維護代碼的時候,顯示調用就限制了靈活性。而Method類,可以說是所有方法的公共“接口”,它實例是每個類裏面的各種各樣的方法。它是抽象的、代號的,而各種具體的方法就是其具體的實現。它的設計思考有點像File類等包裝類。把具體的實現包裝起來,客戶端(應用層)只面對一個抽象的包裝對象,而裏面的具體實現應用層是沒辦法知的。當然具體實現也決定了該包裝類的具體行爲,然後這種包裝類的行爲規範是統一的。能有效地利用反射相關的這些類,可以增加開發的靈活性,尤其重要的是,我們可以在程序運行時,改變程序的行爲,當然這種行爲必須是正當的。當我們有了選擇的時候,就必須權衡兩種方式的優缺點。利用反射,程序的靈活性增強了,但是這種靈活是要犧牲一定的效率的。顯試調用能使程序的可讀性增強,能夠明確開發代碼意圖,也不會犧牲太大的效率。綜合運用兩種方式才能達到最佳的效果。
對反射的思考——另一種抽象,另一種實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Java設計模式和設計思想學習筆記
HeapStone
2020-07-08 11:55:44
面向接口編程----思維
dwj_daiwenjie
2020-07-08 10:29:15
大話設計模式C++版本-04-代理模式
wkd_007
2020-07-08 10:27:39
大話設計模式C++版本-07-模板方法模式
wkd_007
2020-07-08 10:27:28
大話設計模式C++版本-05-工廠方法模式
wkd_007
2020-07-08 10:27:26
大話設計模式C++版本-06-原型模式
wkd_007
2020-07-08 10:27:25
大話設計模式C++版本-03-裝飾模式
wkd_007
2020-07-08 10:27:25
三、單例模式(Singleton Pattern)
Lizza~
2020-07-08 09:38:07
設計模式之委派模式delegate
东山富哥
2020-07-08 09:07:36
使用設計模式出任CEO迎娶白富美(1)--畢業即失業
熊猫大哥大
2020-07-08 08:42:58
mybatis-cache緩存包解析
请叫我程序猿大人
2020-07-08 07:54:47
數據連接池的基本實現
祁琼冉
2020-07-08 07:54:27