标签:
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; } }
标签:
原文地址:http://www.cnblogs.com/superJF/p/5785131.html