我是靠谱客的博主 眼睛大过客,最近开发中收集的这篇文章主要介绍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反射机制详解

转载于:https://www.cnblogs.com/whcwkw1314/p/8654250.html

最后

以上就是眼睛大过客为你收集整理的JAVA反射之私有属性赋值总结反射案例用到的方法:的全部内容,希望文章能够帮你解决JAVA反射之私有属性赋值总结反射案例用到的方法:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部