✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨
欢迎对【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对象属性值赋值给obj2field.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();}
}
运行结果:


















