前言
之前学JavaSE的时候,反射和动态代理的内容囫囵吞枣般略过,后续在工作中也没遇到直接用到反射的场景,所以对这部分内容一直很模糊
最近写一个需求,遇到了一些场景,用反射解决非常简单
场景一:
前端给我传一个对象,对象有差不多20个属性,大部分属性的类型是bigdecimal,但是属性值有可能传null
我接收到对象后需要把这些bigdecimal做个累计,但是每个属性都去做判空处理显然很蠢,百度了后发现可以用反射做
for (Field f : vo.getClass().getDeclaredFields()) { // vo就是需要处理的对象
f.setAccessible(true);
if (f.get(vo) == null && f.getType() == BigDecimal.class) {
f.set(vo, BigDecimal.ZERO);
}
}
场景二:
我需要拿到一个枚举类的所有code和desc,用map接收,也可以用反射很简洁地做出来
Class<FundSubjectEnum> clazz = FundSubjectEnum.class;
FundSubjectEnum[] enumConstants = clazz.getEnumConstants();
for (FundSubjectEnum item : enumConstants) {
subjectMap.put(clazz.getMethod("getCode", null).invoke(item).toString(), clazz.getMethod("getDesc", null).invoke(item).toString());
}
反射肯定不止能做这些事情,但是目前我也只遇到了这两种使用场景
希望可以在后续的工作中继续完善对这一块知识的认知,以及对后续spring源码的学习提供更好地理解