1.項目結構如下

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()
