zoukankan      html  css  js  c++  java
  • 计算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;
        }  
    
    }
  • 相关阅读:
    Javascript闭包的一些研究
    pytorchvision安装问题
    CUDA 基础
    语音识别入门推荐文献【转】
    【e2e】espnet框架安装问题集锦
    维特比算法与beam search
    kaldi识别问题集锦
    语音识别-重要开源数据
    git提交失败总结
    钟南山病后反思: 寿命长短, 不取决于衰老和疾病【转】
  • 原文地址:https://www.cnblogs.com/superJF/p/5785131.html
Copyright © 2011-2022 走看看