選單

Java 反射很容易實作。

目錄

Java 反射很容易實作。

Java反射本節介紹讓 API 使用更便利的實用類別。

什麼是反射?

反射 API“牙齒,”java.lang.reflect它包含在包裝內。
此 API 從 Java 類別中檢索欄位和方法等資訊。
我們將主要使用以下類別。

  • java.lang.Class
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • java.lang.reflect.field

反射使用這種方法,您可以避免直接編寫類別建立和方法呼叫的程式碼。
你可以建立類別實例並從字串執行方法。

透過在 XML 等外部檔案中定義類別名稱和方法名,應用程式可以動態地適應執行時間環境的變化。
此外,它也是一個非常有效的API,可用於建立高度靈活的應用程式。


反思的目的

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

例如,當您想要自動將網頁畫面上的輸入資料設定到 JavaBeans 屬性時,
例如,在發出 SQL 查詢以自動更新 JavaBeans 屬性時,就會使用這種方法。

此外,還提供動態載入和註冊外掛程式等功能,以便在應用程式啟動時擴展其功能。反射使用[這種方法]可以輕鬆實現這一點。

執行範例

現在,請運行範例程式碼,親自體驗基於框架的程式設計。

這裡我們將使用以下類別反射這展示了該工具的簡單使用方法。

Main.java要執行的類別
BeanUtil.java反射實用類
FreeSoft.java……這是一個代表自由軟體的類,用作反射。

●依常規方式執行

System.out.println(“>>正常狀況”);
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(聊天和即時通訊——也支援聊天和即時通訊!!)“);
freeSoft.showName();
freeSoft.showPrice(0);

●使用反射執行時

System.out.println(>>>使用反射時)“);
// 建立 FreeSoft 類別的實例
Object invokeObject = BeanUtil.newInstance(「FreeSoft」)“);
// 為名稱欄位設定值。
BeanUtil.setProperty(invokeObject, “姓名” , “聊天和即時通訊——聊天和即時通訊也一樣!!”);
// 執行 FreeSoft 的 showName() 方法。
BeanUtil.invoke(invokeObject, “showName”, , 無效的);
// 執行 FreeSoft 的 showPrice() 方法。
// 如果該方法有參數,則必須將它們作為 Object 類型的陣列傳遞。
BeanUtil.invoke(invokeObject, “顯示價格”,new Object[]{new Integer(0)});

●執行結果

無論是否使用反射,執行結果都是一樣的。

>>>正常狀況

軟體名稱:聊天和即時通訊!

價格:0日圓

>>>使用反射時

軟體名稱:聊天和即時通訊!

價格:0日圓

BeanUtil 方法詳情

newInstance

public static Object newInstance(字串類別名)拋出異常
這會根據字串“className”建立並傳回一個實例。

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

newInstance

public static Object newInstance(String className, Object[] argObj) 拋出異常
這會根據字串“className”建立並傳回一個實例。

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

newInstance

public static Object newInstance(類 clazz)拋出異常
這會創建並傳回類別“clazz”的一個實例。

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

newInstance

public static Object newInstance(Class clazz, Object[] argObj) 拋出異常
這會創建並傳回類別“clazz”的一個實例。

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

設定屬性

public static void 設定屬性(Object invokeObject, String fieldName, Object value) 拋出例外
呼叫物件“invokeObject”的欄位「fieldName」的setter方法來儲存值「value」。

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

參數:
呼叫對象 要執行的對象
欄位名 – 要執行的物件的屬性名稱
受到推崇的 – 要設定的值
例外:
例外 – 出現以下異常:
呼叫目標異常 - 當底層方法拋出異常時
非法存取異常 此方法物件是 Java
如果實現了語言存取控制,並且無法存取底層方法。
NoSuchMethodException - 如果找不到具有指定名稱的方法

取得屬性

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

參數:
呼叫對象 要執行的對象
欄位名 – 要執行的物件的屬性名稱
傳回值:
Getter 方法傳回值
例外:
例外 – 出現以下異常:
呼叫目標異常 - 當底層方法拋出異常時
非法存取異常 此方法物件是 Java
如果實現了語言存取控制,並且無法存取底層方法。
NoSuchFieldException - 如果找不到具有指定名稱的字段

呼叫

public static Object 呼叫(Object invokeObject, String callMethod, Object[] argObjects) 拋出 InvocationTargetException、IllegalAccessException 或 NoSuchMethodException 異常
這將執行物件“invokeObject”的“callMethod”方法。
如果有傳回值,可以將其作為物件取得。

參數:
呼叫對象 要執行的對象
呼叫方法 – 要執行的方法名稱
argObjects – 若有參數,則以物件陣列的形式傳遞。如果沒有參數,則傳遞 null 值。
傳回值:
執行“callMethod”的回傳值
例外:
呼叫目標異常 - 當底層方法拋出異常時
非法存取異常 此方法物件是 Java
如果實現了語言存取控制,並且無法存取底層方法。
NoSuchMethodException - 如果找不到具有指定名稱的方法

尋找方法

public static 方法 尋找方法(Object invokeObject, String callMethod, Object[] argObjects) 拋出 NoSuchMethodException
這會尋找物件“invokeObject”的方法“callMethod”。

參數:
呼叫對象 要執行的對象
呼叫方法 – 要執行的物件的方法名稱
argObjects – 若有參數,則以物件陣列的形式傳遞。如果沒有參數,則傳遞 null 值。
傳回值:
符合指定參數條件的方法對象
例外:
NoSuchMethodException - 如果找不到符合的方法,或名稱為“”或“”

setField

public static void setField(Object invokeObject, String fieldName, Object value) 拋出 IllegalAccessException, NoSuchFieldException
值“value”儲存在要執行的物件“invokeObject”的名為“fieldName”的欄位中。

參數:
呼叫對象 要執行的對象
欄位名 – 要執行的物件的欄位名稱
受到推崇的 – 要設定的值
例外:
非法存取異常 – 指定的物件是基底欄位(或其子類別或實作)。
如果它不是聲明它的類別或介面的實例,或者解包轉換失敗。
NoSuchFieldException - 如果找不到具有指定名稱的字段

取得字段

public static Object 取得字段(Object invokeObject, String fieldName) 拋出 IllegalAccessException 或 NoSuchFieldException
這將檢索目標物件“invokeObject”的欄位名稱“fieldName”的值。

參數:
呼叫對象 要執行的對象
欄位名 – 要執行的物件的欄位名稱
傳回值:
傳回值
例外:
非法存取異常 – 指定的物件是基底欄位(或其子類別或實作)。
如果它不是聲明它的類別或介面的實例,或者解包轉換失敗。
NoSuchFieldException - 如果找不到具有指定名稱的字段

hasField

公共靜態布林值 hasField(Object object, String fieldName) 拋出例外
此語句檢查物件「object」是否聲明了名為「fieldName」的欄位。

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

取得所有字段

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

取得短類名

public static String 取得短類名(對象對象)
此函數從物件中檢索非限定類別名稱。

參數:
目的
傳回值:

取得短類名

public static String 取得短類名(字串類別名)
這會從完全限定名稱中檢索類別名稱。

參數:
類別名
傳回值:

GETFieldName

public static String GETFieldName(字串方法名)
將欄位名稱從方法名稱變更為其他名稱。這必須符合 JavaBeans 的命名規範。

參數:
資料名稱
傳回值:

isClassExist

公共靜態布林值 isClassExist(字串類別名)
這會檢查完全限定名稱「className」是否為存在的類別名稱。

參數:
類別名
傳回值:

取得屬性描述符

public static PropertyDescriptor[] 取得屬性描述符(物件物件)拋出 IntrospectionException
這將傳回一個 PropertyDescriptor,其中包含“object”的物件資訊。

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

BeanUtil 原始碼

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