自定义注解

//定义一个工具类
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;
	}
	

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值