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());