参数校验-如何判断对象的一部分属性是否全部为空

  • 问题:  在开发中, 对参数校验的时候, 有时需要检查传入的pojo进行参数校验, 传入的参数又需要满足不能全为空这个条件, 这时需要用到反射的方法, 对传入的对象进行属性校验..

  • 举个栗子

  1. 新建一个User对象, imlements Serializable. 其中 serialVersionUID, id 是不是空, 不关心. 但是希望 name, age 两个字段不能全部为空.

  2. new一个user对象, 并将"serialVersionUID", "id"丢入List<String> excludeNames中, 进行测试

public class User implements Serializable {

	private static final long serialVersionUID = 1L; // 这个必然是不为空的, 不关心
	
	private Integer id; // id 是不是为空, 不关心
	
	private String name; // 名字, 希望name和age不要都为空
	
	private Integer age; // age
    
    /* getter 和 setter 方法, 不列出 */
}
public static void main(String[] args) throws Exception {
		
	// 将不关心的字段丢入excludeNames
	List<String> excludeNames = new ArrayList<String>();
	excludeNames.add("serialVersionUID");
	excludeNames.add("id");
		
	// 关心的字段全部为空的情况
	User user = new User();
	user.setName("");
	System.err.println(isAllFieldNull(user, excludeNames));
		
	System.out.println("===============");

	// 关心的字段不全部为空的情况	
	user.setAge(18);
	System.err.println(isAllFieldNull(user, excludeNames));
}

/****************** 以下是判断的方法 *****************/

/**
 * 判断该对象的一部分属性是否全部为空
 * @param obj 对象
 * @param excludeNames 选择忽略校验的属性名称List集合
 * @return boolean
 * @throws Exception
 */
public static boolean isAllFieldNull(Object obj, List<String> excludeNames) throws Exception{
    // 取到obj的class, 并取到所有属性
    Field[] fs = obj.getClass().getDeclaredFields();
    // 定义一个flag, 标记是否所有属性值为空
    boolean flag = true;
    // 遍历所有属性
    for (Field f : fs) {
        f.setAccessible(true); // 设置私有属性也是可以访问的
            // 1.排除不包括的属性名, 2.属性值不为空, 3.属性值转换成String不为"" 
            if(!excludeNames.contains(f.getName()) && f.get(obj) != null && !"".equals(f.get(obj).toString())) {
                // 有属性满足3个条件的话, 那么说明对象属性不全为空
                flag = false;
                break;
            }
        }
        return flag;
    }

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值