以时间校验为例
- @interface关键字定义注解
- 注解定义的方法有一些限制:方法不能有参数;返回值只能是基本类型、字符串、Class、枚举、注解、及以上类型的数组;可以包含默认值。
//描述注解可以文档化,是一个标记注解
@Documented
//具体处理逻辑的实现类
@Constraint(
validatedBy = {TimeGroupValidConstraint.class}
)
/**
*描述注解的使用目标,取值有:
*ElementType.PACKAGE 注解作用于包
*ElementType.TYPE 注解作用于类型(类,接口,注解,枚举)
*ElementType.ANNOTATION_TYPE 注解作用于注解
*ElementType.CONSTRUCTOR 注解作用于构造方法
*ElementType.METHOD 注解作用于方法
*ElementType.PARAMETER 注解作用于方法参数
*ElementType.FIELD 注解作用于属性
*ElementType.LOCAL_VARIABLE 注解作用于局部变量
*默认可以作用于以上任何目标。
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
/**
*描述注解的生命周期,取值有:
*RetentionPolicy.SOURCE 源码中保留,编译期可以处理
*RetentionPolicy.CLASS Class文件中保留,Class加载时可以处理
*RetentionPolicy.RUNTIME 运行时保留,运行中可以处理
*默认RetentionPolicy.CLASS 值
*/
@Retention(RetentionPolicy.RUNTIME)
/**
*是否允许子类继承该注解。即@TimeGroupValid如果修饰了类A,
*那么类A的子类类B也会默认被@TimeGroupValid 修饰。
*/
@Inherited
public @interface TimeGroupValid {
String message() default "TimeGroup was not a compliance value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class TimeGroupValidConstraint implements ConstraintValidator<TimeGroupValid, String> {
public TimeGroupValidConstraint() {
}
//调用方法之前先初始化
@Override
public void initialize(TimeGroupValid constraintAnnotation) {
}
//校验的具体逻辑
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtils.isEmpty(value)) {
return false;
} else {
TimeGroupEnum[] timeGroupEnums = (TimeGroupEnum[])TimeGroupEnum.class.getEnumConstants();
TimeGroupEnum[] var4 = timeGroupEnums;
int var5 = timeGroupEnums.length;
for(int var6 = 0; var6 < var5; ++var6) {
TimeGroupEnum timeGroupEnum = var4[var6];
if (StringUtils.equals(value, timeGroupEnum.getInterval())) {
return true;
}
}
return false;
}
}
}