类似@NonNull注解标注在参数之上,表示对应的值不可以为空,利用java的元注解及注解处理器实现检查属性长度的功能。

 目录

程序效果

实现过程

样例代码

参考资料


程序效果

Java校验 java校验字段长度注解_spring boot

截图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实现自定义注解