Java 反射機制學習:

Java反射機制學習:

Java反射機制主要提供了以下功能,都位於java.lang.reflect包中:

在運行時判斷任意一個對象所屬的類

在運行時構造任意一個類的對象

在運行時判斷任意一個類所具有的成員變量和方法

在運行時調用任意一個對象的方法

如果不知道某個對象的確切類型,RTTI可以告訴你,但是有一個前提:這個類型在編譯時必須已知,這樣才能使用RTTI來識別它。Class類與java.lang.reflect類庫一起對反射進行了支持,該類庫包含FieldMethodConstructor類,這些類的對象由JVM在啓動時創建,用以表示未知類裏對應的成員。這樣的話就可以使用Contructor創建新的對象,用get()set()方法獲取和修改類中與Field對象關聯的字段,用invoke()方法調用與Method對象關聯的方法。另外,還可以調用getFields()getMethods()getConstructors()等許多便利的方法,以返回表示字段、方法、以及構造器對象的數組,這樣,對象信息可以在運行時被完全確定下來,而在編譯時不需要知道關於類的任何事情。

  反射機制並沒有什麼神奇之處,當通過反射與一個未知類型的對象打交道時,JVM只是簡單地檢查這個對象,看它屬於哪個特定的類。因此,那個類的.class對於JVM來說必須是可獲取的,要麼在本地機器上,要麼從網絡獲取。所以對於RTTI和反射之間的真正區別只在於:

RTTI,編譯器在編譯時打開和檢查.class文件

反射,運行時打開和檢查.class文件

Constructor類獲取構造方法,Method類獲取成員方法,Field類獲取成員變量信息。

反射機制的優點:可以實現動態創建對象和編譯,體現出很大的靈活性(特別是在J2EE的開發中它的靈活性就表現的十分明顯)。通過反射機制我們可以獲得類的各種內容,進行了反編譯。對於JAVA這種先編譯再運行的語言來說,反射機制可以使代碼更加靈活,更加容易實現面向對象。

比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯後,發佈了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。採用靜態的話,需要把整個程序重新編譯一次纔可以實現功能的更新,而採用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。 

反射機制的缺點:對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它 滿足我們的要求。這類操作總是慢於只直接執行相同的操作。

Spring IOC中大量運用了反射機制。IOC:即“控制反轉”,不是什麼技術,而是一種思想。使用IOC意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。具體學習博客:https://www.cnblogs.com/baizhanshi/p/6755716.html

對於動態編譯和靜態編譯的對比以及反射提供的方法 參照博客:https://www.cnblogs.com/yrstudy/p/6500982.html

自我理解:反射機制就相當於動態創建類和使用類,反射實例化對象就能很靈活的使用對象。重點在於動態上,將控制權交給容器能大大提高程序的靈活性,當需要修改代碼時,反射機制可以讓我們不必再修改原有的很多代碼,比如注入新的bean時…甚至我們可以通過反射來修改類中的某些參數。

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