对一个类中具有相似名称的属性值进行操作

admin2024-04-03  0

一、问题描述

对于一个类,要依次取得相似的属性名称进行相关操作,如果逐个get(),set()会非常麻烦,例如将属性值逐个求和后放入list。写代码时,首先需要声明一个Integer变量,然后使用+=去赋值,非常麻烦。类似这种重复性代码,考虑使用一个工具类来解决。

之前尝试过使用反射机制去写,import Java.lang.reflect,虽然可以完成需求,但是反射会有性能损耗,因此尝试使用spring框架中的BeanWrapper来写一个工具类。

public static void printIntegerFields(Class<?> clazz) {
		Field[] fields = clazz.getDeclaredFields(); // 获取类中声明的所有字段
		for (Field field : fields) {
			// 判断字段的类型是否为Integer
			if (field.getType().equals(Integer.class)) {
				String name = field.getName();
				if (name.substring(0, 2).equals("gd")) {
                    //处理业务逻辑
					System.out.println(name);
				}
			}
		}
	}

二、数据库

对一个类中具有相似名称的属性值进行操作,第1张

三、工具类

使用@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;
	}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!