1. 程式人生 > >用反射判斷實體類的屬性是否為null(附帶註解版本)

用反射判斷實體類的屬性是否為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。

@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