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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值