一、问题描述
对于一个类,要依次取得相似的属性名称进行相关操作,如果逐个get(),set()会非常麻烦,例如将属性值逐个求和后放入list。写代码时,首先需要声明一个Integer变量,然后使用+=去赋值,非常麻烦。类似这种重复性代码,考虑使用一个工具类来解决。
之前尝试过使用反射机制去写,import Java.lang.reflect,虽然可以完成需求,但是反射会有性能损耗,因此尝试使用spring框架中的BeanWrapper来写一个工具类。
public static void printIntegerFields(Class<?> clazz) {Field[] fields = clazz.getDeclaredFields(); // 获取类中声明的所有字段for (Field field : fields) {// 判断字段的类型是否为Integerif (field.getType().equals(Integer.class)) {String name = field.getName();if (name.substring(0, 2).equals("gd")) {//处理业务逻辑System.out.println(name);}}}}
二、数据库
三、工具类
使用@Service或者@Component进行注解,spring框架扫描后@Autowired进行依赖注入
public int sumPropertyData(List<? extends CommonEntity> entitys, List<String> dataAxis, List<Integer> dataGd,List<Integer> dataLd) {int total = 0;Map<String, Integer> map = new HashMap<>();for (Object entity : entitys) {// 动态获取getter函数BeanWrapper bw = new BeanWrapperImpl(entity);// 得到所有字段属性名for (PropertyDescriptor propertyDescriptor : bw.getPropertyDescriptors()) {String propertyName = propertyDescriptor.getName();// 以gd开头的属性if (propertyName.substring(0, 2).equals("gd") || propertyName.substring(0, 2).equals("ld")) {Integer value = (Integer) bw.getPropertyValue(propertyName);Integer pre = map.getOrDefault(propertyName, 0);pre += value;map.put(propertyName, pre);total += value;}}}// 从map里将数据传给准备好的list,有人为顺序要求.for (int i = 0; i < dataAxis.size(); i++) {String str = dataAxis.get(i);dataGd.add(map.get("gd" + PropertyEnum.getName(str)));dataLd.add(map.get("ld" + PropertyEnum.getName(str)));}return total;}