選單

Java 反射變簡單

目錄

Java 反射變簡單

爪哇反射引入一個實用程式類,可讓您輕鬆使用 API。

什麼是反射?

反射API牙齒,”java.lang.reflect” 包含在包裝中,
這是一個從 Java 類別檢索欄位和方法等資訊的 API。
主要用到以下幾個類別。

  • java.lang.Class
  • java.lang.reflect.建構函數
  • java.lang.reflect.Method
  • java.lang.reflect.Field

反射透過使用,您可以建立類別或呼叫方法,而無需直接對其進行編碼。
您可以從字串建立類別實例或執行方法。

透過將類別名稱和方法名稱的定義寫入外部檔案(例如 XML)中,您可以動態地使應用程式適應執行時間環境的變化。
它也是建立高度靈活的應用程式的非常有效的 API。


反思的目的

反射使用者不常直接使用,
它廣泛應用於 Struts 等 Web 應用程式和 O/R 映射等框架中。

例如,當自動將 Web 畫面輸入資料設定為 JavaBeans 屬性時,
它在發出基於 JavaBeans 屬性自動更新的 SQL 時使用。

此外,還提供諸如在應用程式啟動時動態載入和註冊擴充功能的插件等功能。反射使用 可以輕鬆實現這一點。

運行範例

請運行範例並體驗類似框架的程式設計。

這裡我們使用下面的類別反射示範該實用程式的簡單用法。

主程式.java....要執行的類別
BeanUtil.java...反射實用程式類
自由軟體.java……用作代表自由軟體的類別中的反射。

●正常執行時

System.out.println(“>>>正常狀況”);
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(“聊天和信使聊天和信使!!”);
freeSoft.showName();
freeSoft.showPrice(0);

●使用反射執行時

系統輸出列印文件(“>>>使用反射時”);
//建立FreeSoft類別的實例
物件 invokeObject = BeanUtil.newInstance(“自由軟體”);
//設定名稱欄位中的值。
BeanUtil.setProperty(invokeObject, “姓名” , “聊天和信使 聊天和信使!!”);
// 執行 FreeSoft 的 showName() 方法。
BeanUtil.invoke(invokeObject, “演出名稱”, 無效的);
// 執行 FreeSoft 的 showPrice() 方法。
// 如果方法有參數,則它們必須作為物件類型陣列傳遞。
BeanUtil.invoke(invokeObject, “顯示價格”,new Object[]{new Integer(0)});

●執行結果

無論是正常情況還是使用反射,執行結果都是一樣的。

>>> 正常情況

軟體名稱:Chat&Messenger 聊天和信差! !

價格:0日圓

>>> 使用反射時

軟體名稱:Chat&Messenger 聊天和信差! !

價格:0日圓

BeanUtil 方法詳細信息

新實例

公共靜態物件 新實例(字串類別名)拋出異常
從字串“className”產生並傳回一個實例。

參數:
班級名稱 – 完全限定的類別名
傳回值:
完全限定類別名稱的新實例
例外:
例外

新實例

公共靜態物件 新實例(String className, Object[] argObj) 拋出異常
從字串“className”產生並傳回一個實例。

參數:
班級名稱 – 完全限定的類別名
argObj – 建構函式參數
傳回值:
完全限定類別名稱的新實例
例外:
例外

新實例

公共靜態物件 新實例(類 clazz)拋出異常
產生並傳回類別“clazz”的實例。

參數:
克拉茲 - 班級
傳回值:
clazz 的新實例
例外:
例外

新實例

公共靜態物件 新實例(類別 clazz,Object[] argObj)拋出異常
產生並傳回類別“clazz”的實例。

參數:
克拉茲 - 班級
argObj – 建構函式參數
傳回值:
clazz 的新實例
例外:
例外

設定屬性

公共靜態無效 設定屬性(物件invokeObject,字串欄位名稱,物件值)拋出異常
呼叫物件“invokeObject”的欄位“fieldName”的setter方法並儲存值“value”。

如果沒有setter方法,值將直接設定到欄位中。但是,在這種情況下,目標屬性的存取修飾符必須是 public。

參數:
呼叫對象 – 要執行的對象
欄位名 – 要執行的物件的屬性名稱
價值 – 要設定的值
例外:
例外 – 出現以下異常。
呼叫目標異常 – 如果底層方法拋出異常
非法存取異常 – 這個Method物件是Java
當實現語言存取控製而無法存取底層方法時
沒有這樣的方法異常 – 如果找不到指定名稱的方法

取得屬性

公共靜態物件 取得屬性(Object invokeObject, String fieldName) 拋出例外
呼叫物件invokeObject的欄位fieldName的getter方法取得值。
如果沒有 getter 方法,將直接從欄位中檢索值。但是,在這種情況下,目標屬性的存取修飾符必須是 public。

參數:
呼叫對象 – 要執行的對象
欄位名 – 要執行的物件的屬性名稱
傳回值:
Getter方法傳回值
例外:
例外 – 出現以下異常。
呼叫目標異常 – 如果底層方法拋出異常
非法存取異常 – 這個Method物件是Java
當實現語言存取控製而無法存取底層方法時
沒有這樣的欄位異常 – 如果未找到指定名稱的字段

呼叫

公共靜態物件 呼叫(Object invokeObject、String callMethod、Object[] argObjects) 拋出 InvokingTargetException、IllegalAccessException、NoSuchMethodException
執行物件“invokeObject”的方法“callMethod”。
如果有傳回值,則可以以 Object 的形式取得。

參數:
呼叫對象 – 要執行的對象
呼叫方法 – 要執行的方法名稱
arg對象 – 如果有參數,則將它們作為物件陣列傳遞。如果沒有參數,則傳遞 null。
傳回值:
執行“callMethod”的回傳值
例外:
呼叫目標異常 – 如果底層方法拋出異常
非法存取異常 – 這個Method物件是Java
當實現語言存取控製而無法存取底層方法時
沒有這樣的方法異常 – 如果找不到指定名稱的方法

尋找方法

公共靜態方法 尋找方法(Object invokeObject, String callMethod, Object[] argObjects) 拋出 NoSuchMethodException
搜尋物件“invokeObject”的方法“callMethod”。

參數:
呼叫對象 – 要執行的對象
呼叫方法 – 要執行的物件的方法名稱
arg對象 – 如果有參數,則將它們作為物件陣列傳遞。如果沒有參數,則傳遞 null。
傳回值:
與指定參數條件相符的 Method 對象
例外:
沒有這樣的方法異常 – 如果沒有找到符合的方法,或名稱是“”或“”

設定字段

公共靜態無效 設定字段(物件 invokeObject、字串欄位名稱、物件值)拋出 IllegalAccessException、NoSuchFieldException
將值「value」儲存在要執行的物件「invokeObject」的欄位名稱「fieldName」中。

參數:
呼叫對象 – 要執行的對象
欄位名 – 待執行物件的欄位名
價值 – 要設定的值
例外:
非法存取異常 – 指定物件所基於的欄位(或其子類別或實作者)
不是它聲明的類別或介面的實例,或展開轉換失敗
沒有這樣的欄位異常 – 如果未找到指定名稱的字段

取得字段

公共靜態物件 取得字段(Object invokeObject, String fieldName) 拋出 IllegalAccessException, NoSuchFieldException
取得要執行的物件「invokeObject」的欄位名稱「fieldName」的值。

參數:
呼叫對象 – 要執行的對象
欄位名 – 待執行物件的欄位名
傳回值:
傳回值
例外:
非法存取異常 – 指定物件所基於的欄位(或其子類別或實作者)
不是它聲明的類別或介面的實例,或展開轉換失敗
沒有這樣的欄位異常 – 如果未找到指定名稱的字段

有字段

公共靜態布林值 有字段(對象對象,字串欄位名稱)拋出異常
檢查物件“object”是否聲明欄位名稱“fieldName”。

參數:
目的 – 待檢查對象
欄位名 – 要檢查的欄位名稱
傳回值:
true 如果聲明
例外:
例外

取得所有字段

公共靜態java.util.TreeSet 取得所有字段(對象對象)拋出異常
參數:
目的
傳回值:
例外:
例外

取得短類名

公共靜態字串 取得短類名(對象對象)
從物件取得非限定類別名稱。

參數:
目的
傳回值:

取得短類名

公共靜態字串 取得短類名(字串類別名)
從完全限定名稱中取得類別名稱。

參數:
班級名稱
傳回值:

取得欄位名

公共靜態字串 取得欄位名(字串方法名稱)
更改方法名稱中的欄位名稱。必須符合 JavaBeans 約定。

參數:
方法名
傳回值:

類別是否存在

公共靜態布林值 類別是否存在(字串類別名)
驗證完全限定名稱「className」是否是現有的類別名稱。

參數:
班級名稱
傳回值:

取得屬性描述符

公共靜態PropertyDescriptor[] 取得屬性描述符(Object 物件) 拋出 IntrospectionException
傳回一個 PropertyDescriptor,其中保存「object」的物件資訊。

參數:
目的
傳回值:
例外:
java.beans.IntrospectionException

BeanUtil原始碼

  • 網址をコピーしました!
目錄