Java什麼是反射機制?反射機制的概念

2020-07-16 10:05:19
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() 只是獲取在本類中定義的成員變數和方法。