1. 程式人生 > 其它 >Java反射機制的基礎詳解

Java反射機制的基礎詳解

Java反射機制是Java語言的一個重要特性。在學習Java反射機制前,大家應該先了解兩個概念,編譯期和執行期。

編譯期是指把原始碼交給編譯器編譯成計算機可以執行的檔案的過程。在Java中也就是把Java程式碼編成class檔案的過程。編譯期只是做了一些翻譯功能,並沒有把程式碼放在記憶體中執行起來,而只是把程式碼當成文字進行操作,比如檢查錯誤。

執行期是把編譯後的檔案交給計算機執行,直到程式執行結束。所謂執行期就把在磁碟中的程式碼放到記憶體中執行起來。

Java反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為Java語言的反射機制。簡單來說,反射機制指的是程式在執行時能夠獲取自身的資訊。在Java中,只要給定類的名字,就可以通過反射機制來獲得類的所有資訊。

Java反射機制在伺服器程式和中介軟體程式中得到了廣泛運用。在伺服器端,往往需要根據客戶的請求,動態呼叫某一個物件的特定方法。此外,在ORM中介軟體的實現中,運用Java反射機制可以讀取任意一個JavaBean的所有屬性,或者給這些屬性賦值。

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

  • 在執行時判斷任意一個物件所屬的類。

  • 在執行時構造任意一個類的物件。

  • 在執行時判斷任意一個類所具有的成員變數和方法。

  • 在執行時呼叫任意一個物件的方法。

  • 生成動態代理。

要想知道一個類的屬性和方法,必須先獲取到該類的位元組碼檔案物件。獲取類的資訊時,使用的就是Class類中的方法。所以先要獲取到每一個位元組碼檔案(.class)對應的Class型別的物件.

眾所周知,所有Java類均繼承了Object類,在Object類中定義了一個getClass()方法,該方法返回同一個型別為Class的物件。例如,下面的示例程式碼:

利用 Class 類的物件 labelCls 可以訪問 labelCls 物件的描述資訊、JLabel 類的資訊以及基類 Object 的資訊。表 1 列出了通過反射可以訪問的資訊。

如表1所示,在呼叫getFields()和getMethods()方法時將會依次獲取許可權為public的欄位和變數,然後將包含從超類中繼承到的成員變數和方法。而通過getDeclareFields()和getDeclareMethod()只是獲取在本類中定義的成員變數和方法。

Java反射機制的優缺點

優點:

  • 能夠執行時動態獲取類的例項,大大提高系統的靈活性和擴充套件性。
  • 與Java動態編譯相結合,可以實現無比強大的功能。
  • 對於Java這種先編譯再執行的語言,能夠讓我們很方便的建立靈活的程式碼,這些程式碼可以在執行時裝配,無需在元件之間進行原始碼的連結,更加容易實現面向物件。

缺點:

  • 反射會消耗一定的系統資源,因此,如果不需要動態地建立一個物件,那麼就不需要用反射;
  • 反射呼叫方法時可以忽略許可權檢查,獲取這個類的私有方法和屬性,因此可能會破壞類的封裝性而導致安全問題。

Java反射機制在一般的Java應用開發中很少使用,即便是Java EE階段也很少使用。