java遍历类属性,并给字段赋值

今天做一个导出excel的功能,需要导出八九十个字段,然后发觉一个字段报空指针异常,遂改用三元运算符,

cell2.setCellValue(prpSsalaries.get(i).getFixedSalary()==null?"0":prpSsalaries.get(i).getFixedSalary().toString());

后来发觉很多BigDecimal字段都为空,然后导出的时候报空指针异常,想想不可能这八九十个字段都加判断吧,然后就写了一个工具类,用来转换 Long,BigDecimal为空的(double默认为0,因此可以忽略),默认为0处理,创建一个辅助类,用于测试,代码如下:

import java.math.BigDecimal;
/**
 * Created by hanjun on 2020/5/28.
 */

public class Test {
	private Long Id;
	private String name;
	private BigDecimal basicSalary;
	private BigDecimal notzero=new BigDecimal(1);
	private double salaryAdd;
	public Long getId() {
		return Id;
	}
	public void setId(Long id) {
		Id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public BigDecimal getBasicSalary() {
		return basicSalary;
	}
	public void setBasicSalary(BigDecimal basicSalary) {
		this.basicSalary = basicSalary;
	}
	public double getSalaryAdd() {
		return salaryAdd;
	}
	public void setSalaryAdd(double salaryAdd) {
		this.salaryAdd = salaryAdd;
	}
	public BigDecimal getNotzero() {
		return notzero;
	}
	public void setNotzero(BigDecimal notzero) {
		this.notzero = notzero;
	}
}
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
/**
 * Created by hanjun on 2020/5/28.
 */
public class NoZeroUtil {
    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
    	Test aa=new Test();
    	System.out.println("name:"+aa.getName());
    	System.out.println("salaryAdd:"+aa.getSalaryAdd());
    	System.out.println("basicSalary:"+aa.getBasicSalary());
    	System.out.println("id:"+aa.getId());
    	System.out.println("notzero:"+aa.getNotzero());
    	getbig(aa);
    	System.out.println("处理后为name:"+aa.getName());
    	System.out.println("处理后为salaryAdd:"+aa.getSalaryAdd());
    	System.out.println("处理后为basicSalary:"+aa.getBasicSalary());
    	System.out.println("处理后为id:"+aa.getId());
    	System.out.println("处理后notzero为:"+aa.getNotzero());
 
    }
   public  static void  getbig( Object object) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{
	   Field[] f=object.getClass().getDeclaredFields();
	   for(int i=0;i<f.length;i++){
           //获取属相名
           String attributeName=f[i].getName();
           //将属性名的首字母变为大写,为执行set/get方法做准备
           String methodName=attributeName.substring(0,1).toUpperCase()+attributeName.substring(1);
           try{
        	   if(f[i].getType()==BigDecimal.class&&getFieldValueByName(f[i].getName(), object)==null){
        		   //获取属性类型,并且为空(不为空的当然不用赋值了,不然传进来对象有值属性都赋值为0,那不得搞你人)
          		 Method setMethod=object.getClass().getMethod("set"+methodName,BigDecimal.class);
                   setMethod.invoke(object,new BigDecimal(0));
          	}else if(f[i].getType()==Long.class&&getFieldValueByName(f[i].getName(), object)==null){
         		 Method setMethod=object.getClass().getMethod("set"+methodName,Long.class);
                 setMethod.invoke(object,0L);
        	} 
           }catch (NoSuchMethodException e) {
               e.printStackTrace();
           }
       } 
   } 
   //获取对象值
   private static Object getFieldValueByName(String fieldName, Object o) {  
       try {    
           String firstLetter = fieldName.substring(0, 1).toUpperCase();    
           String getter = "get" + firstLetter + fieldName.substring(1);    
           Method method = o.getClass().getMethod(getter, new Class[] {});    
           Object value = method.invoke(o, new Object[] {});    
           return value;    
       } catch (Exception e) {    
	          e.printStackTrace();
           return null;    
       }    
   }  

}

运行结果为:可以看出double类型会默认为0,因此不用赋值,但是BigDecimal类型默认为空,使用过之后对象属性就不会报空指针异常了

猜你喜欢

转载自blog.csdn.net/jungeCSND/article/details/106408032
今日推荐