Java反射設置和訪問私有屬性值


越學習到后面,越感覺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實例引用)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM