本次用手机号码为示例编写一个自定义注解,可使用在属性、参数、方法上。
一、编写注解(@interface)类
- 注解基础知识必须掌握
@Retention :用来说明该注解类的生命周期。它有以下三个参数:
RetentionPolicy.SOURCE : 注解只保留在源文件中
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target : 用来说明该注解可以被声明在那些元素之前。
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。
@Constraint来限定自定义注解的方法
@Documented注解
Documented注解表明这个注释是由 javadoc记录
- 注解类
@Constraint(validatedBy = Phone.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PhoneRegex {
String message() default "手机号码不正确";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
- 数据验证类需实现ConstraintValidator接口
PhoneRegex是注解类名称
String是字段类型
public class Phone implements ConstraintValidator<PhoneRegex,String> {
@Override
public void initialize(PhoneRegex constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
String regex="^[1](([3|5|8][\\d])|([4][5,6,7,8,9])|([6][5,6])|([7][3,4,5,6,7,8])|([9][8,9]))[\\d]{8}$";
if(StringUtils.isNotEmpty(value)){
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(value);
return m.matches();
}
return false;
}
}
- 使用方法
@PhoneRegex
private String contactPhone;