Springboot中如何自定义注解以及使用2例
不说废话,直接进入正题:
java自定义注解主要有3步:
1.编写@interface接口
2.编写@interface对应的处理方法进行处理
3.调用处理方法
示例一:判断奇偶
比如有一个字段no要判断奇偶,是偶数就抛出异常,有以下实体类:@Data public class Book { private int no; private String author; private String bookName; }
要判断 no是奇数还是偶数,首先写注解接口IsOdd:
@Target(ElementType.FIELD) // 注解用于字段上 @Retention(RetentionPolicy.RUNTIME) // 保留到运行时,可通过注解获取 public @interface IsOdd { }
第二步,在类InterfaceUtil中编写IsOdd的处理方法,其中需要注意如果要获取Feild的private属性的话必须使用getDeclaredFields()方法,但是这时只是获取到了属性,get静态字段会报错,要记得在获得静态数据前设置为可访问setAccessible(true):
public static void isOdd(Book book) throws IllegalAccessException { //自定义注解获取所有的属性,包括private的 for(Field field:book.getClass().getDeclaredFields()){ IsOdd isOdd=field.getAnnotation(IsOdd.class); if(isOdd!=null){ //private的字段必须要设置成可访问后才能get,不然报错 field.setAccessible(true); Object value=field.get(book); if (value instanceof Integer){ int s=(int) value; if((s&1)!=1){//判偶 throw new RuntimeException(s+"不是奇数!"); } } } } }
接下来是测试代码:
@Test public void writeSimpleExcelShouldSuccess() throws IllegalAccessException { List<Book> sheetOne=new ArrayList<>(); Book book1=new Book(); book1.setNo(2); book1.setAuthor("老舍"); book1.setBookName("三味书屋"); InterfaceUtil.isOdd(book1); //调用注解对应的方法 }
结果如下:
示例二:判断长度
同样,如果现在要no的长度在1-10之间,可以这样:
@Target(ElementType.FIELD) // 注解用于字段上 @Retention(RetentionPolicy.RUNTIME) // 保留到运行时,可通过注解获取 public @interface Face { int min() default 1; int max() default 10; }
最好设置defaut默认值
接下来是处理方法
public static void check(Book book) throws IllegalAccessException { //自定义注解获取所有的属性,包括private的 for (Field field : book.getClass().getDeclaredFields()) { Face face=field.getAnnotation(Face.class); if(face!=null){ //private的字段必须要设置成可访问后才能get,不然报错 field.setAccessible(true); Object value = field.get(book); if (value instanceof Integer) { int s = (int) value; // 判断值是否满足@Face的min/max: if (s < face.min() || s > face.max()) { throw new IllegalArgumentException("出错了:" + field.getName()); } } } } }
接下来测试:
List<Book> sheetOne=new ArrayList<>(); Book book1=new Book(); book1.setNo(20); book1.setAuthor("老舍"); book1.setBookName("三味书屋"); InterfaceUtil.check(book1);
出错结果如下:
总的说来,自定义注解就这么几步,不过不同元注解,元注解可以直接使用而不需要再在其它地方调用,自定义注解在注解后还需要再进行调用(如InterfaceUtil.check(book1)),这里必须要注意。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)