判断某个对象属性值都不为空/至少有一个属性值不为空

如果是字符串属性则不为null和不为""

有时候,controller参数接收json对象,我们需要判断该对象中的属性值是否都不为空(都是必须的)/至少有一个属性值不为空,其中字符串属性不为null和不为“”,如果对象参数多,controller里面遍历每一个属性去判断,代码冗余。

当然还有另外的方法,比如spring框架中的注解@NotNull,@NotBlank,@Valid。

import org.springframework.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Title:判断某个对象属性值都不为空,字符串属性不为空和不为空字符串
 * Description:利用类的反射获取,前提是javabean中的属性都是包装类
 * @author WZQ
 * @version 1.0.0
 * @date 2020/4/19
 */
public class ObjIsUtil {

    /**
     * 根据属性名获取属性值
     */
    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) {
            return null;
        }
    }

    /**
     * 判断对象中的属性值是否都不为空,字符串属性的需要判断空字符串
     */
    public static Boolean isAllNotNull(Object o) {
        //获取对象的属性数组,反射
        Field[] fields = o.getClass().getDeclaredFields();
        String name = "";
        for (int i = 0; i < fields.length; i++) {
            //属性名
            name = fields[i].getName();

            //pojos和dto含有serialVersionUID,得去掉该字段的判断
            if (name.equals("serialVersionUID"))
                continue;

            //当前属性名的值
            Object fieldValueByName = getFieldValueByName(name, o);

            //值为null
            if (fieldValueByName == null)
                return false;

            //如果是String,判断空字符串""
            if (fields[i].getType().equals(String.class)){
                String s = (String) fieldValueByName;
                if (StringUtils.isEmpty(s)){
                    return false;
                }
            }

        }
        return true;
    }

    /**
     * 判断对象中的属性值至少有一个不为空
     */
    public static Boolean oneNotNull(Object o) {
        //获取对象的属性数组,反射
        Field[] fields = o.getClass().getDeclaredFields();
        String name = "";
        for (int i = 0; i < fields.length; i++) {
            //属性名
            name = fields[i].getName();

            //当前属性名的值
            Object fieldValueByName = getFieldValueByName(name, o);

            //如果是String,判断空字符串""
            if (fields[i].getType().equals(String.class)){
                String s = (String) fieldValueByName;
                if (!StringUtils.isEmpty(s)){
                    return true;
                }
            }else{
                //值为null
                if (fieldValueByName != null)
                    return true;
            }

        }
        return false;
    }

//    public static void main(String[] args) {
//        Usertest usertest = new Usertest("1","name",1);
//        Usertest usertest1 = new Usertest("","",null);
//        Usertest usertest2 = new Usertest("1","",null);
//        Usertest usertest3 = new Usertest("1",null,1);
//        System.out.println(isAllNotNull(usertest));//true
//        System.out.println(isAllNotNull(usertest1));//false
//        System.out.println(isAllNotNull(usertest2));//false
//        System.out.println(isAllNotNull(usertest3));//false
//        System.out.println(oneNotNull(usertest));//true
//        System.out.println(oneNotNull(usertest1));//false
//    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzq_55552

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值