计算bean的和(java)

  bean中的属性过多时,要计算一个bean的list之和是一件非常麻烦的事情,可以用java的反射机制解决这件事情,代码如下:

package com.jzzhcs.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 系统通用工具类
 * 
 * @author Jeffy
 *
 */
public class Util {

    /**
     * 遍历bean的属性
     * 
     * @author Jeffy
     * @param e
     *            bean对象
     * @throws Exception
     */
    public static void reflect(Object e) throws Exception {
        Class<? extends Object> cls = e.getClass();
        Field[] fields = cls.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            Field f = fields[i];
            f.setAccessible(true);
            System.out.println("属性名:" + f.getName() + " 属性值:" + f.get(e));
        }
    }

    /**
     * 计算bean的和
     * 利用java反射原理获取传入的object的属性值以及getset方法
     * @author Jeffy
     * @param e
     *            bean对象
     * @throws Exception
     */
    public static Object getSumOfBean(List<?> list) throws Exception {
        Class<? extends Object> cls = list.get(0).getClass();
        Object resultBean = cls.newInstance();
        for (Object o : list) {
            Field[] fields = cls.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {

                Field f = fields[i];
                //因为写成private 所以这里必须设置
                f.setAccessible(true);
                //定义属性名和属性值
                String fieldName = f.getName();
                Object fieldValue = f.get(o);
                //定义构造get、set方法所使用的变量名
                String name = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                //定义get、set方法
                Method getMethod = resultBean.getClass().getMethod("get" + name);
                //调用get方法
                Object value = getMethod.invoke(resultBean);
                
                // 获取属性的类型
                String type = f.getGenericType().toString();
                // 如果type是类类型,则前面包含"class ",后面跟类名
                if (type.equals("class java.lang.String")) {
                }
                if (type.equals("class java.lang.Double")) {
                    if (fieldValue != null) {
//                        System.out.println("属性名为:" + name);
//                        System.out.println("属性值为:" + value);
                        Method setMethod = resultBean.getClass().getMethod("set" + name,Double.class);
                        if((Double)value != null){
                            setMethod.invoke(resultBean, (Double)value + (Double)fieldValue);
                        } else {
                            setMethod.invoke(resultBean, (Double)fieldValue);
                        }
//                        System.out.println(getMethod.invoke(resultBean));
                    } else {
                        System.out.println("属性值为:空");
                    }
                }
            }
        }
        return resultBean;
    }

    public static void main(String[] args) throws Exception {
        Entity e = new Entity();
        List<Entity> list = new ArrayList<Entity>();
        e.setD1(1.0);
        e.setD2(3.0);
        e.setD3(7.0);
        list.add(e);
        e = new Entity();
        e.setD1(13.0);
        e.setD2(17.0);
        e.setD3(23.0);
        list.add(e);
        Object o = getSumOfBean(list);
        return ;
    }

}

getSumOfBean方法是主要逻辑,遍历list中的所有bean,将bean的Double类型的属性求和,通过反射调用结果bean的set方法,将属性值存入结果bean。

下面是bean的定义:

package com.jzzhcs.utils;

public class Entity {
    private String s1 = "字符串1";  
      
    private Double d1;  
      
    private Double d2;  
      
    private Double d3;

    public String getS1() {
        return s1;
    }

    public void setS1(String s1) {
        this.s1 = s1;
    }

    public Double getD1() {
        return d1;
    }

    public void setD1(Double d1) {
        this.d1 = d1;
    }

    public Double getD2() {
        return d2;
    }

    public void setD2(Double d2) {
        this.d2 = d2;
    }

    public Double getD3() {
        return d3;
    }

    public void setD3(Double d3) {
        this.d3 = d3;
    }  

}
原文地址:https://www.cnblogs.com/superJF/p/5785131.html