类似@NonNull注解标注在参数之上,表示对应的值不可以为空,利用java的元注解及注解处理器实现检查属性长度的功能。
目录
程序效果
实现过程
样例代码
参考资料
程序效果
截图1.用户名超长提示
检查登录时“用户名”、“密码”字段的长度,此时用户名超长。
实现过程
1.注解的定义
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。
注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
2.使用到的java元注解
名称 | 作用 | 属性 | 取值 |
---|---|---|---|
@Target | 标识该注解用在什么地方 | ElementType | FIELD:在属性上使用 METHOD:在方法上使用 PARAMETER:在参数上使用 TYPE:在类、接口或enum上使用 ... |
@Retention | 表示生效的阶段 | RetentionPolicy | SOURCE:注解在编译时被丢弃 CLASS:注解在class文件中存在,但会被JVM丢弃 RUNTIME:JVM运行时也会保留注解,可以通过反射机制获取注解信息 |
使用其中的:
@Target({ElementType.FIELD}):表示对字段进行注解。
@Retention(RetentionPolicy.RUNTIME):表示可以在运行时获取到注解参数进行判断。
3.注解处理器的常规使用
Field[] fields = clazz.getDeclaredFields(); //获取类的字段
LengthJudge test = field.getAnnotation(LengthJudge.class); //获取属性上的@LengthJudge注解
样例代码
1.自定义的注解“LengthJudge”
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LengthJudge {
int max() default 0;
int min() default 0;
String description() default "";
}
含3个注解值,max表示接收输入的最大长度,民表示最小长度,description表示提示信息。
2.使用注解的类“LoginReq”
public class LoginReq {
@LengthJudge(min = 6,max = 10,description = "用户名长度在6-10个字符之间")
private String name;
@LengthJudge(min = 6,max =10,description = "密码长度在6-10个字符之间")
private String password;
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
用户登录的请求结构,包含“用户名”、“密码”2个字段,使用注解“LengthJudege”时注解入参传递最短最长以及报错提示描述,给后面的注解处理器使用。
3.注解处理器及main函数
public class AnnoTest {
public static void valid(Object obj) throws IllegalAccessException {
Class<?> clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field:fields){
LengthJudge test = field.getAnnotation(LengthJudge.class);//获取属性上的@LengthJudge注解
if(test != null){
field.setAccessible(true);//设置属性可访问
if("class java.lang.String".equals(field.getGenericType().toString())){//字符串类型的才判断长度
String value = (String)field.get(obj);
//长度校验
if(value != null && ((value.length() > test.max()) || value.length() < test.min())){
System.out.println(test.description());
}
}
}
}
}
public static void main(String[] args) {
LoginReq annotation = new LoginReq();
annotation.setName("abcefg111"); //用户名超过6位
annotation.setPassword("1234567890"); //密码长度合法
try {
valid(annotation);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
参考资料
1.Java实现自定义注解
https://blog.csdn.net/zt15732625878/article/details/100061528