//定义一个工具类
public class JudgeUtils {
public static void checkAge(Object object) throws Exception {
List<String> alarmMessageList = Annotation.judge(object);
if(alarmMessageList != null && alarmMessageList.size() > 0) {
alarmMessageList.stream().forEach(element ->System.err.println(element));
}
}
}
以前,『XML』是各大框架的青睐者,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,『XML』的内容也越来越复杂,维护成本变高。
于是就有人提出来一种标记式高耦合的配置方式,『注解』。方法上可以进行注解,类上也可以注解,字段属性上也可以注解,反正几乎需要配置的地方都可以进行注解。
先来看一下 JDK中定义的注解 如@override,点进去看里面的实现如下
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
可以看到这个注解的实现中又发现了两个注解@Target 和 @Retention 这两个就是所谓的元注解 (简单可以理解为注解的注解)一般用于指定某个注解生命周期以及作用目标等信息
完整地看一下几个元注解
@Target:注解的作用目标 比如是方法啊,还是属性啊等等
@Retention:注解的生命周期
- RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
- RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
- RetentionPolicy.RUNTIME:永久保存,可以反射获取
@Documented:注解是否应当被包含在 JavaDoc 文档中
@Inherited:是否允许子类继承该注解
了解了注解的基础知识之后 我尝试自定义一个注解来实现对类中的属性判空的功能
具体的代码如下
声明一个注解 作用域在FIELD上, 活动时期是 运行时
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateNotNull {
String message() default "";
}
//定义一个作用的实体类
@Data
public class User {
@ValidateNotNull( message ="年龄")
private int age;
@ValidateNotNull(message = "姓名")
private String name;
@ValidateNotNull(message = "地址")
private String address;
@ValidateNotNull(message = "学号")
private String no;
}
//通过反射实现注解的功能
public class Annotation {
public static <T> List<String> judge(T t)throws Exception{
List<String> messageList = new ArrayList();
//获取当前值
Field [] fields = t.getClass().getDeclaredFields();
//循环遍历该对象的属性 判断是不是加了该注解
for(Field field : fields) {
if(field.isAnnotationPresent(ValidateNotNull.class)) {
ValidateNotNull ValidateNotNull = field.getAnnotation(ValidateNotNull.class);
field.setAccessible(true);
//获取t这个对象中的 (被加上该注解的) 属性信息
Object value = field.get(t);
if(value == null) {
//获取属性上的注解信息
ValidateNotNull info = field.getAnnotation(ValidateNotNull.class);
String message = info.message() + "不能为空";
messageList.add(message);
}
}
}
return messageList;
}
}