王旭阳个人博客

WXY

Java 反射技术实现 List 合计功能的工具类

2024-12-27

在开发过程中,我们经常需要对一个 List 中的对象进行合计计算。例如,统计一组销售数据、订单金额、用户访问量等,可能需要对某些数值字段进行合计。这些字段可能是 intIntegerBigDecimal 类型。为了简化这类任务,我们可以封装一个通用的工具类,使用 Java 的反射机制动态地对列表中的属性进行合计。

本篇文章将介绍如何实现一个通用的 List 合计工具类,并且支持对 intIntegerBigDecimal 类型的字段进行合计。通过这个工具类,开发者可以轻松对任何类型的对象列表进行合计,减少重复代码,提高开发效率。

工具类实现

利用 Java 的反射机制,我们可以动态地访问对象的字段值,并对其进行合计。下面是 ListSumUtil 类的实现:

ListSumUtil

import java.math.BigDecimal;
import java.util.List;

/**
 * Author: wxy97.com
 * Date: 2024/12/26 15:01
 * Description: 使用反射和泛型对 List 中的对象进行合计操作
 */
public class ListSumUtil {

	public static <T> T calculateTotal(List<T> list, Class<T> clazz)
		throws IllegalAccessException, InstantiationException {
		// 创建一个新的实例,用于存放合计结果
		T total = clazz.newInstance();

		// 遍历列表中的每个元素进行合计
		for (T item : list) {
			// 遍历该对象的字段
			java.lang.reflect.Field[] fields = clazz.getDeclaredFields();
			for (java.lang.reflect.Field field : fields) {
				field.setAccessible(true); // 设置字段可访问

				// 获取字段的类型
				Class<?> fieldType = field.getType();

				// 对 int 类型字段进行合计
				if (fieldType == int.class) {
					int fieldValue = field.getInt(item);
					field.setInt(total, field.getInt(total) + fieldValue); // 合计
				}

				// 对 Integer 类型字段进行合计
				else if (fieldType == Integer.class) {
					Integer fieldValue = (Integer) field.get(item);
					if (fieldValue != null) {
						Integer currentTotal = (Integer) field.get(total);
						if (currentTotal == null) {
							currentTotal = 0;
						}
						field.set(total, currentTotal + fieldValue); // 合计
					}
				}

				// 对 BigDecimal 类型字段进行合计
				else if (fieldType == BigDecimal.class) {
					BigDecimal fieldValue = (BigDecimal) field.get(item);
					if (fieldValue != null) {
						BigDecimal currentTotal = (BigDecimal) field.get(total);
						if (currentTotal == null) {
							currentTotal = BigDecimal.ZERO;
						}
						field.set(total, currentTotal.add(fieldValue)); // 合计
					}
				}
			}
		}

		return total;
	}
}

代码解析

  • 反射获取字段:通过 clazz.getDeclaredFields() 方法获取类的所有字段,并使用 field.setAccessible(true) 使其可以被访问。

  • 合计逻辑:根据字段的类型(intIntegerBigDecimal),分别对字段进行累加。特别地,对于 BigDecimal 类型,使用 add() 方法进行累加。

  • 泛型支持:我们使用泛型,使得该工具类可以适用于任何类的列表。

总结

通过这个 ListSumUtil 工具类,我们可以高效地对任何包含 intIntegerBigDecimal 字段的对象列表进行合计,而不需要手动编写重复的代码。该工具类使用了 Java 反射机制,使得它具有良好的通用性,能够适用于各种业务场景。

你可以根据自己的需求,扩展该工具类,增加对其他类型字段的支持,或者定制合计逻辑。