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)),这里必须要注意。