Java 反射機制是 Java 語言的一個重要特性,它在伺服器程式和中介軟體程式中得到了廣泛運用。在伺服器端,往往需要根據客戶的請求,動態呼叫某一個物件的特定方法。此外,
在 ORM 中介軟體的實現中,運用 Java 反射機制可以讀取任意一個 JavaBean 的所有屬性,或者給這些屬性賦值。
Java 反射機制主要提供了以下功能,這些功能都位於
java.lang.reflect
包。
-
在執行時判斷任意一個物件所屬的類。
-
在執行時構造任意一個類的物件。
-
在執行時判斷任意一個類所具有的成員變數和方法。
-
在執行時呼叫任意一個物件的方法。
-
生成動態代理。
眾所周知,所有 Java 類均繼承了 Object 類,在 Object 類中定義了一個 getClass() 方法,該方法返回同一個型別為 Class 的物件。例如,下面的範例程式碼:
Class labelCls = label1.getClass(); // label1為 JLabel 類的物件
利用 Class 類的物件 labelCls 可以存取 labelCls 物件的描述資訊、JLabel 類的資訊以及基礎類別 Object 的資訊。表 1 列出了通過反射可以存取的資訊。
表 1 反射可存取的常用資訊
型別 |
存取方法 |
返回值型別 |
說明 |
包路徑 |
getPackage() |
Package 物件 |
獲取該類的存放路徑 |
類名稱 |
getName() |
String 物件 |
獲取該類的名稱 |
繼承類 |
getSuperclass() |
Class 物件 |
獲取該類繼承的類 |
實現介面 |
getlnterfaces() |
Class 型陣列 |
獲取該類實現的所有介面 |
構造方法 |
getConstructors() |
Constructor 型陣列 |
獲取所有許可權為 public 的構造方法 |
getDeclaredContruectors() |
Constructor 物件 |
獲取當前物件的所有構造方法 |
方法 |
getMethods() |
Methods 型陣列 |
獲取所有許可權為 public 的方法 |
getDeclaredMethods() |
Methods 物件 |
獲取當前物件的所有方法 |
成員變數 |
getFields() |
Field 型陣列 |
獲取所有許可權為 public 的成員變數 |
getDeclareFileds() |
Field 物件 |
獲取當前物件的所有成員變數 |
內部類 |
getClasses() |
Class 型陣列 |
獲取所有許可權為 public 的內部類 |
getDeclaredClasses() |
Class 型陣列 |
獲取所有內部類 |
內部類的宣告類 |
getDeclaringClass() |
Class 物件 |
如果該類為內部類,則返回它的成員類,否則返回 null |
如表 1 所示,在呼叫 getFields() 和 getMethods() 方法時將會依次獲取許可權為 public 的欄位和變數,然後將包含從超類中繼承到的成員變數和方法。而通過 getDeclareFields() 和 getDeclareMethod() 只是獲取在本類中定義的成員變數和方法。