java利用反射获取指定字段名的值和设置字段的值

一.获取指定字段的值

  • 需求:
  • 用户设置要显示的字段,比如用户选择要显示的字段是:姓名,性别,年龄这三个字段,其余字段就不显示
  • 查询数据库获得的实体类里面包含了用户需要显示的字段,如何通过用户选择的字段去匹配获取相对应的值?
@Data
public class Student {

    private String name ;

    private int age ;
}
public class Test {

    static Class clazz1= Student.class;

    public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {

        Student student=new Student();
        student.setName("张三");
        student.setAge(20);

        //方式1
        String fieldName="name";
        //通过字符串的变化拼接处getName,即获取name的get方法
        String	methodName="get"+
                fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
        Method method = clazz1.getMethod(methodName);
        Object object = method.invoke(student);
        System.out.println(object.toString());//输出:张三

        //方式2

        //假设选择要现实的字段是name和age两个,或者多个以上
        String[] strArr = new String[]{"name","age"};
        Map resultMap = new HashMap();
        for (String s : strArr) {
            Field field = clazz1.getDeclaredField(s);//获取私有字段
            field.setAccessible(true);//设置权限
            Object object2 = field.get(student);//该参数为想要获取值得对象

            System.out.println(object2.toString());
            resultMap.put(s,object2.toString());
        }
        System.out.println(resultMap);

        //map转实体类
        Student student2=new Student();
        student2 = JSON.parseObject(JSON.toJSONString(resultMap), Student.class);

        System.out.println(student2);
    }
}

测试输出
在这里插入图片描述

二.设置字段的值

//设置字段的值
        //方式一
        Field field = clazz1.getDeclaredField("name");
        Object object3=clazz1.newInstance();
        field.setAccessible(true);
        field.set(object3,"王五");
        Student student3=(Student) object3;
        System.out.println(student3.getName());
        //方式二

        Student student4=new Student();
        String fieldName2="name";
        String methodName2="set"+fieldName2.substring(0,1).toUpperCase()+
                fieldName.substring(1);
        Method method2 = clazz1.getMethod(methodName2,String.class);
        method2.invoke(student4, "李四");
        System.out.println(student4.getName());

版权声明:本文为BelleHarvester原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。