为 "你的对象" 属性赋予默认值

我是一只斑马

  • 这篇博客的要做什么,解决什么问题
  • 为了解决这个问题,需要用到什么知识
  • 具体的代码,效果
  1. 在实际开发中,为了避免出现不必要的空指针异常(NullPointerException)。需要判断是否为空,如果一个对象的属性每次在取的时候都要调用一个方法去判断是否null;整体代码会显得更加臃肿累赘。
  2. 所以需要写一个工具类在创建,使用对象之前,完成判断,并在需要的属性上赋予默认值;在这个工具类中使用反射的知识进行获取属性对象,判断类型和值;除了反射之外,还有  commons-beanutils  包下的方法

导包

<dependencies>
    <!--使用@Data注解完成实体类的set,get-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.12.6</version>
    </dependency>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.9.2</version>
    </dependency>
  </dependencies>

一个实体类

//我只一只斑马
import lombok.Data;

import java.util.List;

@Data
public class Banma {
    private String name;
    private char sex;
    private int age;
    private Double money;
    private String[] hobby;
    private List<String> strList;
}

一个方法

package com.banma.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

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

public class VoUtils {
    /**
     * 我是一只斑马
     * 初始化vo属性的值,在属性为空的情况下赋一个默认值,如为Double型赋0
     * @param obj
     */
    public static void initVoNullProperties(Object obj) {
        if (obj == null) {
            return;
        }
        try {
            if(obj instanceof List){
                List list = (List) obj;
                initListNullProperties(list);
                return;
            }
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field : fields) {
                Object p = PropertyUtils.getProperty(obj, field.getName());
                if (p == null) {
                    if(field.getType() == Double.class) {
                        BeanUtils.setProperty(obj, field.getName(), Double.valueOf(0));
                    } else if(field.getType() == String.class) {
                        BeanUtils.setProperty(obj, field.getName(), "");
                    }
                } else if(p instanceof List) {
                    List list = (List) PropertyUtils.getProperty(obj, field.getName());
                    initListNullProperties(list);
                }
            }
            List<Class> classes = new ArrayList<Class>(Arrays.asList(Double.class,String.class,Integer.class,Long.class,long.class,int.class));
            Method[] methods = obj.getClass().getDeclaredMethods();
            for(Method method : methods){
                if(method.getName().startsWith("get") && !classes.contains(method.getReturnType())){
                    Object tmp = null;
                    tmp = method.invoke(obj);
                    if(tmp == null){
                        tmp = method.getReturnType().getConstructors().length>0 ? method.getReturnType().getConstructors()[0].newInstance():null;
                        if(tmp == null){
                            //log
                        }
                    }else{
                        tmp = method.getReturnType().cast(tmp);
                    }

                    initVoNullProperties(tmp);
                    Method setter = obj.getClass().getDeclaredMethod("set"+method.getName().substring(3), method.getReturnType());
                    setter.invoke(obj, tmp);

                }
            }
        } catch (Exception e) {

        }
    }

    /**
     * 初始化list属性的值,在属性为空的情况下赋一个默认值,如为Double型赋0
     * @param list
     */
    public static void initListNullProperties(List list) {
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            Object object = (Object) iterator.next();
            initVoNullProperties(object);
        }
    }
}

测试和测试结果

//我是一只斑马
import com.banma.entity.Banma;
import com.banma.utils.VoUtils;

public class Demo {
    public static void main(String[] args) {
        Banma banma = new Banma();
        System.out.println(banma);
        VoUtils.initVoNullProperties(banma);
        System.out.println(banma);
    }
}

猜你喜欢

转载自blog.csdn.net/JzCm__/article/details/88867868