對反射的思考——另一種抽象,另一種實現

反射實現了在程序運行時動態編譯生存對象的一種機制。這個機制依賴對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類等包裝類。把具體的實現包裝起來,客戶端(應用層)只面對一個抽象的包裝對象,而裏面的具體實現應用層是沒辦法知的。當然具體實現也決定了該包裝類的具體行爲,然後這種包裝類的行爲規範是統一的。能有效地利用反射相關的這些類,可以增加開發的靈活性,尤其重要的是,我們可以在程序運行時,改變程序的行爲,當然這種行爲必須是正當的。當我們有了選擇的時候,就必須權衡兩種方式的優缺點。利用反射,程序的靈活性增強了,但是這種靈活是要犧牲一定的效率的。顯試調用能使程序的可讀性增強,能夠明確開發代碼意圖,也不會犧牲太大的效率。綜合運用兩種方式才能達到最佳的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章