JAVA反射之私有属性赋值

案例:Map集合若有key(键)与User类中的私有属性相同,就把对应的value值赋值给该私有属性。

User类

	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 + '\'' +
                '}';
    }
}

测试类:

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

在这里插入图片描述

引用自博客园 https://www.cnblogs.com/whcwkw1314/p/8654250.html @汪Vely

猜你喜欢

转载自blog.csdn.net/pujinhong0412/article/details/94379002