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類型默認爲空,使用過之後對象屬性就不會報空指針異常了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章