用反射判断实体类的属性是否为null(附带注解版本)

这个是用来验证表单传来的json对象里是否必填,如果值为null或者“”时返回属性的名字

代码

    /**
     *  java反射机制判断对象所有属性是否全部为空
     * @param obj
     * @return 返回属性名称
     */
    public static String checkObjFieldIsNotNull(Object obj,String remark){
        try {
            for (Field f : obj.getClass().getDeclaredFields()) {
                f.setAccessible(true);
                if(f.getName().equals(remark)){
                    continue;
                }
                if (f.get(obj) == null || f.get(obj) == "") {
                    return f.getName();
                }
            }
        }catch (Exception e){
            return null;
        }
        return null;
    }

如果只需要返回boolean类型可以改成下面这种

    /**
     *  java反射机制判断对象所有属性是否全部为空
     * @param obj
     * @return 返回属性名称
     */
    public static boolean checkObjFieldIsNotNull(Object obj,String remark){
        try {
            for (Field f : obj.getClass().getDeclaredFields()) {
                f.setAccessible(true);
                if(f.getName().equals(remark)){
                    continue;
                }
                if (f.get(obj) == null || f.get(obj) == "") {
                    return false;
                }
            }
        }catch (Exception e){
            return false;
        }
        return true;
    }

之后遇到有些对象运行某些成员属性w为null,采用上面的方法就有点不可用了,所有采用了一种注解的方式

在类属性上添加@AllowNull,则可以运行这个属性为null。

关于注解,可以看这篇文章秒懂,Java 注解 (Annotation)你可以这样学

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface AllowNull {
    String value() default "";
}

判断方法

    /**
     * 通过实体类中添加注解来判断是否对象是否可以为null
     * @param obj
     * @return
     */
    public static Boolean checkNotNull(Object obj) {
        try {
            Class<?> clazz = obj.getClass();
            //获得私有的成员属性
            Field[] fields = clazz.getDeclaredFields();
            if(fields!=null && fields.length>0){
                for(Field f : fields){
                    f.setAccessible(true);
                    //判断AllowNull注解是否存在
                    if(f.isAnnotationPresent(AllowNull.class)){
                        continue;
                    }else {
                        if(f.get(obj)==null || "".equals(f.get(obj))){
                            return false;
                        }
                    }
                }
            }
        } catch (IllegalAccessException e) {
            return false;
        }
        return true;
    }

最后测试

public class AnnoTest {
    @AllowNull
    private String name;

    public static void main(String[] args) {
        AnnoTest annoTest = new AnnoTest();
        Boolean aBoolean = ReflectUtils.checkNotNull(annoTest);
        System.out.println(aBoolean);
    }
}

输出结果

结果输出true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值