Java反射设置/获取对象属性值三种方式
作者:zhuzicc
这篇文章主要给大家介绍了关于Java反射设置/获取对象属性值的三种方式,反射机制的用途非常多,比如获取方法,属性名和属性值等,甚至可以获取标签等标签属性,需要的朋友可以参考下
本文总结:Java 通过反射设置对象属性值,或者获取对象属性值,编码过程中反射结合泛型使用可以代码复用,减少冗余代码;
食用建议:配合场景案例食用更佳;
设置/获取属性
实体类对象:
@AllArgsConstructor @NoArgsConstructor @Data public class StudentScore { /** * 名称 */ private String name; /** * 科目 */ private String subject; /** * 成绩 */ private Integer score; }
方式一
通过Field操作属性:
public void method1() throws Exception { Class<StudentScore> cls = StudentScore.class; StudentScore obj = new StudentScore(); StudentScore obj2 = new StudentScore(); /* * 设置属性 */ Field nameField = cls.getDeclaredField("name"); nameField.setAccessible(true); nameField.set(obj, "张三"); Field subjectField = cls.getDeclaredField("subject"); subjectField.setAccessible(true); subjectField.set(obj, "语文"); Field scoreField = cls.getDeclaredField("score"); scoreField.setAccessible(true); scoreField.set(obj, 100); /* * 获取属性 */ Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { String s = Modifier.toString(field.getModifiers()); // 排除final修饰的属性 if (!s.contains("final")) { field.setAccessible(true); // 通过filed获取设置属性 System.out.printf("获取属性值,当前属性:%s,值:%s%n", field.getName(), field.get(obj)); // obj对象属性值赋值给obj2 field.set(obj2, field.get(obj)); } } System.out.println("method1 obj:" + JSONObject.toJSONString(obj)); System.out.println("method1 obj2:" + JSONObject.toJSONString(obj2)); }
运行结果:
方式二
通过set方法:
public void method2() throws Exception { Class<StudentScore> cls = StudentScore.class; StudentScore obj = new StudentScore(); /* * 设置属性 */ Method setName = cls.getMethod("setName", String.class); setName.invoke(obj, "李四"); Method setSubject = cls.getMethod("setSubject", String.class); setSubject.invoke(obj, "语文"); Method setScore = cls.getMethod("setScore", Integer.class); setScore.invoke(obj, 114); /* * 获取属性 */ Method getName = cls.getMethod("getName"); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "name", getName.invoke(obj)); Method getSubject = cls.getMethod("getSubject"); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "subject", getSubject.invoke(obj)); Method getScore = cls.getMethod("getScore"); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "score", getScore.invoke(obj)); System.out.println("method2:" + JSONObject.toJSONString(obj)); }
运行结果:
方式三
通过属性名:
public void method3() throws Exception { Class<StudentScore> cls = StudentScore.class; StudentScore obj = new StudentScore(); /* * 设置属性 */ PropertyDescriptor namePd = new PropertyDescriptor("name", cls); Method writeMethod = namePd.getWriteMethod(); writeMethod.invoke(obj, "王五"); PropertyDescriptor subjectPd = new PropertyDescriptor("subject", cls); Method subjectMethod = subjectPd.getWriteMethod(); subjectMethod.invoke(obj, "语文"); PropertyDescriptor scorePd = new PropertyDescriptor("score", cls); Method scoreMethod = scorePd.getWriteMethod(); scoreMethod.invoke(obj, 127); /* * 获取属性 */ Method nameRead = namePd.getReadMethod(); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "name", nameRead.invoke(obj)); Method subjectRead = subjectPd.getReadMethod(); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "subject", subjectRead.invoke(obj)); Method scoreRead = scorePd.getReadMethod(); System.out.printf("获取属性值,当前属性:%s,值:%s%n", "score", scoreRead.invoke(obj)); System.out.println("method3:" + JSONObject.toJSONString(obj)); }
运行结果:
场景案例
场景:学生查询自己的语文考试成绩;
学生成绩对象实体类:
/** * 学生成绩实体 */ @AllArgsConstructor @NoArgsConstructor @Data public class StudentScore { /** * 名称 */ private String name; /** * 科目 */ private String subject; /** * 成绩 */ private Integer score; }
学生对象实体类:
/** * 学生-张三 */ @Data public class StudentZS extends StudentScore { } /** * 学生-李四 * */ @Data public class StudentLS extends StudentScore { } /** * 学生-王五 */ @Data public class StudentWW extends StudentScore { }
测试:
@Test public void testDemo() { StudentZS student1 = new StudentZS(); student1.setName("张三"); scoreSystem(student1, StudentZS.class); System.out.println("张三查询成绩结果:" + JSONObject.toJSONString(student1)); StudentLS student2 = new StudentLS(); student2.setName("李四"); scoreSystem(student2, StudentLS.class); System.out.println("李四查询成绩结果:" + JSONObject.toJSONString(student2)); StudentWW student3 = new StudentWW(); student3.setName("王五"); scoreSystem(student3, StudentWW.class); System.out.println("王五查询成绩结果:" + JSONObject.toJSONString(student3)); } /** * 成绩系统 * * @param t 学生 * @param cls 学生类 * @param <T> 泛型 */ public <T> void scoreSystem(T t, Class<T> cls) { // 给传入对象赋值名称 try { Class<? super T> superclass = cls.getSuperclass(); Field nameField = superclass.getDeclaredField("name"); Type genericType = nameField.getGenericType(); String typeName = genericType.getTypeName(); assert "java.lang.String".equals(typeName); nameField.setAccessible(true); String studentName = nameField.get(t).toString(); int schoolReport = 0; switch (studentName) { case "张三": schoolReport = 100; break; case "李四": schoolReport = 114; break; case "王五": schoolReport = 127; break; } Field subjectField = superclass.getDeclaredField("subject"); subjectField.setAccessible(true); subjectField.set(t, "语文"); Field scoreField = superclass.getDeclaredField("score"); scoreField.setAccessible(true); scoreField.set(t, schoolReport); } catch (Exception e) { e.printStackTrace(); } }
运行结果:
总结
到此这篇关于Java反射设置/获取对象属性值三种方式的文章就介绍到这了,更多相关Java反射设置/获取属性值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!