Java中的注解2_自定義注解實現非空判斷


1.項目結構如下

image-20210425221210761

2.YangNotNull

package cn.yang37.annotation.p20210425;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * @Description: 自定義注解 實現非空判斷
 * @Author: Yiang37
 * @Date: 2021/04/25 21:45:45
 * @Version: 1.0
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface YangNotNull {
     String value();
}

3.YangNotNullExplain

package cn.yang37.annotation.p20210425;


import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description:
 * @Class: YangNotNullExplain
 * @Author: Yiang37
 * @Date: 2021/4/25 21:47
 * @Version: 1.0
 */
public class YangNotNullExplain {
    public static <T> List<String> validate(T t) throws IllegalAccessException {
        // 結果list
        ArrayList<String> resList = new ArrayList<>();
        // 獲取入參類t中的Field,可以理解為Filed為一個字段對象,會包含字段名,字段類型等屬性.
        Field[] declaredFields = t.getClass().getDeclaredFields();

        for (Field declaredField : declaredFields) {
            if (declaredField.isAnnotationPresent(YangNotNull.class)) {
                // 反射獲取的字段值 設置不檢查訪問權限
                declaredField.setAccessible(true);
                Object value = declaredField.get(t);
                if (value == null) {
                    resList.add(declaredField.getAnnotation(YangNotNull.class).value() + " :不能為空!");
                }
            }
        }
        return resList;
    }
}

4.User

package cn.yang37.annotation.p20210425;

import com.alibaba.fastjson.JSON;
import lombok.Data;

/**
 * @Description:
 * @Class: User
 * @Author: Yiang37
 * @Date: 2021/4/25 21:56
 * @Version: 1.0
 */
@Data
public class User {

    @YangNotNull("特意聲明這是username字段上注解的值")
    private String username;

    @YangNotNull("特意聲明這是age字段上注解的值")
    private int age;

    @YangNotNull("特意聲明這是sex字段上注解的值")
    private String sex;

    @Override
    public String toString() {
        return JSON.toJSONString(this,true);
    }
}

5.UserTest

package cn.yang37.annotation.p20210425;

import java.util.List;

/**
 * @Description:
 * @Class: UserTest
 * @Author: Yiang37
 * @Date: 2021/4/25 21:59
 * @Version: 1.0
 */
public class UserTest {
    public static void main(String[] args) throws IllegalAccessException {
        // 注意初始化時String默認為null, 即user -> {"age":0}
        User user = new User();
        System.out.println(user.toString());

        // 獲取校驗結果
        List<String> validateList = YangNotNullExplain.validate(user);

        validateList.forEach(System.out::println);
    }
}

結果

{
	"age":0
}
特意聲明這是username字段上注解的值 : 不能為空!
特意聲明這是sex字段上注解的值 : 不能為空!

6.擴展:方法說明

要有區分字段值和注解值的意識

6.1 getDeclaredFields()

返回Class中所有的字段,包括私有字段.

getFields(): 只返回公有字段

6.2 java.lang.reflect.Field.get(Object obj)

返回指定對象上由此Field表示的字段的值.

// declaredField字段在t對象中的實際值
Object value = declaredField.get(t);

6.3 isAnnotationPresent(Class<? extends Annotation> annotationClass)

對象上是否有該注解

// declaredField上是否有注解@YangNotNull
declaredField.isAnnotationPresent(YangNotNull.class);

6.4 getAnnotation(Class< A > annotationClass) 方法返回該元素的指定類型的注釋

獲取對象上的該注解

// declaredField上@YangNotNull注解的注解實際值
declaredField.getAnnotation(YangNotNull.class).value()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM