为啥加了@NotBlank就可以校验不为空 原理是什么?
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
// 检测是否有@NotEmpty注解
if(field.isAnnotationPresent(NotEmpty.class)){
field.setAccessible(true);
// 如果为空 抛出一个异常
if(field.get(arg) == null){
// 获取到注解中的value里的内容作为异常的信息抛出
NotEmpty annotation = field.getAnnotation(NotEmpty.class);
Method value = annotation.annotationType().getDeclaredMethod("value");
value.setAccessible(true);
throw new EmptyException(value.invoke(annotation).toString());
}
}
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotEmpty {
//错误信息
public String value() default "存在非空字段为空";
}
我之前一个项目自己写的@NotEmpty的注解 然后这段代码是拿来验证是否为空的
8 回答6.4k 阅读
3 回答2.3k 阅读✓ 已解决
2 回答3.3k 阅读
2 回答3.9k 阅读
3 回答1.7k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
1 回答2.9k 阅读
你可以去看看java注解的原理, 注解其实就是一个类定义了一些属性, 其实那些功能的实现并不在注解类里, 而在调用者那
调用者通过反射获取属性或方法上的注解, 实现一些功能
单独一个注解是没有作用的, 每个注解必然存在一个调用者
比如我有一个
User
类我就可以实现一个方法
这就是一个简单的例子, 可以看到这里
@NotBlank
只是起到了一个标记的作用其他注解的功能也大致如此, 有的只是没有这么明显的调用从而让人误以为加上注解自然而然就有这个功能了
就像
Spring
中的@RequestMapping
其实也通过代理Controller
的方法来实现url映射
的