JAVA反射之私有屬性賦值


案例:Map集合若有key(鍵)與User類中的私有屬性相同,就把對應的value值賦值給該私有屬性。

public class User {
    private int id;
    private String name;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
User類

測試類:

public class Test {
    Map<String,Object> map = new HashMap<String,Object>();

    @org.junit.Test
    public void test() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        map.put("name","whc");
        map.put("sex","");

        Class<?> classu = Class.forName("reflect.User");
        //得到user類的全部屬性(修飾符+類型+名字)
        Field[] userFields = classu.getDeclaredFields();
        User user = new User();
        for (int i = 0; i <userFields.length ; i++) {
            // AccessibleTest類中的成員變量為private,故必須進行此操作
            // 取消屬性的訪問權限控制,即使private屬性也可以進行訪問。
            userFields[i].setAccessible(true);
            //遍歷keyset
            for (String s : map.keySet()) {
                ////如果有屬性名和key相同
                if (userFields[i].getName().equals(s)){
                    // 將指定對象變量上(user) 此Field對象表示的字段設置為指定的新值。
                   userFields[i].set(user,map.get(s));
                }
            }
        }
        System.out.println(user);
    }


    @org.junit.Test
    public void test2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        map.put("name","whc");
        map.put("sex","");

        Class<?> classu = Class.forName("reflect.User");
        //得到user類的全部屬性(修飾符+類型+名字)
        Field[] userFields = classu.getDeclaredFields();
        User user = (User) classu.newInstance();
        for (int i = 0; i <userFields.length ; i++) {//遍歷keyset
            for (String s : map.keySet()) {
                //如果有屬性名和key相同
                if (userFields[i].getName().equals(s)){
                    //調用user類中的set方法 注意set方法后面字母大寫
                    Method method = classu.getMethod("set" + s.substring(0, 1).toUpperCase() + s.substring(1), String.class);
                    method.invoke(user,map.get(s));
                }
            }
        }
        System.out.println(user);
    }
}

第一種:直接在指定對象(user)  將Field對象表示的字段設置為指定的新值。注意:取消屬性的訪問權限控制

第二種:通過得到User類中的set方法給私有屬性賦值

結果:

 

 

總結反射案例用到的方法:

1.實例化Class類對象

 Class<?> classu = Class.forName("reflect.User");

2.獲得某個類的全部屬性

Field[] userFields = classu.getDeclaredFields();

3.取消權限的訪問控制

userFields[i].setAccessible(true);

4.得到屬性的字段名

userFields[i].getName()

5.將指定對象變量上(user) 此Field對象表示的字段設置為指定的新值。

userFields[i].set(user,map.get(s));

6.通過反射實例化類的對象

User user = (User) classu.newInstance();

7.通過反射機制調用某個類的方法

 Method method = classu.getMethod();//參數:方法名  若方法有參數,加上參數類型的class對象
 method.invoke();//參數:實例化出來的類對象,若方法有參數,加上值value

 

 

參考:JAVA反射機制詳解


免責聲明!

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



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