反射(Reflection)是Java 程式開發語言的特徵之一,它允許運行中的Java 程式取得自身的信息,並且可以在執行時間存取Java物件的屬性,方法,建構方法等。
應用情境
發展通用框架 - 反射最重要的用途是發展各種通用框架。例如Spring透過XML 檔案配置JavaBean、Filter 等,為了確保框架的通用性,它們可能需要根據設定檔載入不同的物件或類,呼叫不同的方法,這個時候就必須用到反射——執行時間動態載入需要載入的對象。動態代理 - 在切面程式設計(AOP)中,需要攔截特定的方法,通常,會選擇動態代理方式。註解 - 註解本身只是起到標記作用,它需要利用反射機制,根據註解標記去呼叫註解解釋器,執行行為。如果沒有反射機制,註解並不比註解更有用。可擴充性功能 - 應用程式可以透過使用完全限定名稱建立可擴充性物件實例來使用外部的使用者定義類別。缺點
效能開銷 大- 反射操作的效能比非反射操作的效能差,應該在效能敏感的應用程式中頻繁呼叫的程式碼片段中避免。破壞封裝性 - 反射呼叫方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全性問題。內部曝光 - 由於反射允許程式碼執行在非反射程式碼中非法的操作,例如存取私有欄位和方法,所以反射的使用可能會導致意想不到的副作用,這可能會導致程式碼功能失常並可能破壞可移植性。反射程式碼打破了抽象,因此可能會隨著平台的升級而改變行為。 Class 物件
要想使用反射,首先需要取得待操作的類別所對應的 Class 物件。
反射的本質:在執行時,把每個Java 類別中的各種屬性映射成一個個的 Java 物件。
假如定義了以下程式碼:
User user = new User();
1、JVM 載入方法的時候,遇到new User(),JVM 會根據User的全限定名去載入User.class;
2、JVM 會去本機磁碟尋找User.class檔案並載入JVM 記憶體。
3、JVM 透過呼叫類別載入器自動建立這個類別對應的Class對象,並且儲存在 JVM 的方法區。
獲得Class 的三種方法:
(1)使用Class 類別的 forName靜態方法
應用場景
開發通用框架 - 反射最重要的用途就是開發各種通用框架。例如Spring透過XML 檔案配置JavaBean、Filter 等,為了確保框架的通用性,它們可能需要根據設定檔載入不同的物件或類,呼叫不同的方法,這個時候就必須用到反射——執行時間動態載入需要載入的對象。動態代理 - 在切面程式設計(AOP)中,需要攔截特定的方法,通常,會選擇動態代理方式。註解 - 註解本身只是起到標記作用,它需要利用反射機制,根據註解標記去呼叫註解解釋器,執行行為。如果沒有反射機制,註解並不比註解更有用。可擴充性功能 - 應用程式可以透過使用完全限定名稱建立可擴充性物件實例來使用外部的使用者定義類別。缺點
效能開銷 大- 反射操作的效能比非反射操作的效能差,應該在效能敏感的應用程式中頻繁呼叫的程式碼片段中避免。破壞封裝性 - 反射呼叫方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全性問題。內部曝光 - 由於反射允許程式碼執行在非反射程式碼中非法的操作,例如存取私有欄位和方法,所以反射的使用可能會導致意想不到的副作用,這可能會導致程式碼功能失常並可能破壞可移植性。反射程式碼打破了抽象,因此可能會隨著平台的升級而改變行為。 Class 物件
要想使用反射,首先需要取得待操作的類別所對應的 Class 物件。
反射的本質:在執行時,把每個Java 類別中的各種屬性映射成一個個的 Java 物件。
假如定義了以下程式碼:
User user = new User();
1、JVM 載入方法的時候,遇到new User(),JVM 會根據User的全限定名去載入User.class;
2、JVM 會去本機磁碟尋找User.class檔案並載入JVM 記憶體。
3、JVM 透過呼叫類別載入器自動建立這個類別對應的Class對象,並且儲存在 JVM 的方法區。
取得 Class 的三種方法:
(1)使用 Class 類別的 forName靜態方法
(2)呼叫Object 的getClass方法
#反射建立實例物件
用Class物件的newInstance方法。用Constructor物件的newInstance 方法
java.lang.reflect套件的核心介面和類別
Member介面- 反映關於單一成員(字段或方法)或構造函數的標識資訊。 Field類別 - 提供一個類別的網域的資訊以及存取類別的網域的介面。 Method類別 - 提供一個類別的方法的資訊以及存取類別的方法的介面。 Constructor類別 - 提供一個類別的建構子的資訊以及存取類別的建構子的介面。 Array類別 - 此類別提供動態地產生和存取 JAVA 陣列的方法。 Modifier類別 - 提供了 static 方法和常數,對類別和成員存取修飾符進行解碼。 Proxy類別 - 提供動態地產生代理類別和類別實例的靜態方法。
【推薦課程:Java相關課程】
以上是java基礎反射Reflection簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!