Java反射設定和訪問私有屬性值
阿新 • • 發佈:2018-12-10
越學習到後面,越感覺java反射機制很重要,必須精通,要不框架那塊比較難自己動手實現,回過頭溫習一下反射機制,查漏補缺
今天嘗試了一下通過反射訪問和設定類的私有屬性(不設定settesr和getters),比較容易理解,程式碼一貼就知道了
下面是po程式碼:
package cn.liangqinghai.reflect; public class Beans1 { public Beans1(){ System.out.println("無參構造呼叫"); } public Beans1(String name){ System.out.println("帶引數建構函式"+name); } public String getName(){ return "getName返回值"; } /** * 設定私有屬性,並沒有設定setters和getters */ private String userName = "username"; private String adminName = "adminName"; }
下面是測試類:
/** * 測試反射訪問屬性 */ @Test public void testFields() { try { Class<?> clazz = Class.forName("cn.liangqinghai.reflect.Beans1"); // Beans1 bean = (Beans1) clazz.newInstance(); Field[] fs = clazz.getDeclaredFields(); for (Field field : fs) { // 要設定屬性可達,不然會丟擲IllegalAccessException異常 field.setAccessible(true); // 列印初始值 System.out.println("設定屬性之前:" + field.getName() + "===" + field.get(bean)); // 設定屬性值,set(Object obj, Object value) // obj - 應該修改其欄位的物件 // value - 正被修改的 obj 的欄位的新值(參考api) field.set(bean, "Liang"); // 列印設定屬性之後的值 System.out.println("設定屬性之後:" + field.getName() + "=" + field.get(bean)); } } catch (Exception e) { e.printStackTrace(); } }
最終執行結果:
無參構造呼叫
設定屬性之前:userName===username
設定屬性之後:userName=Liang
設定屬性之前:adminName===adminName
設定屬性之後:adminName=Liang
總結:通過反射機制獲取和設定類的私有屬性就這樣, 注意點: 1、屬性Field要設定.setAccessible(true),不然會報IllegalAccessException異常 2、Field.set(obj,value)中,第一個引數是當前物件(參考程式碼中的bean例項引用)