首页 > 技术文章 > Springboot中如何自定义注解以及使用2例

hx-web 2020-08-06 21:26 原文

不说废话,直接进入正题:

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);    //调用注解对应的方法
}

结果如下:

ca734736ac1cc7d04110b6490a683446.png  

 

例二:判断长度

同样,如果现在要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);

出错结果如下:

dbc746f2eaa5ebcd16ef07b25a693578.png  

总的说来,自定义注解就这么几步,不过不同元注解,元注解可以直接使用而不需要再在其它地方调用,自定义注解在注解后还需要再进行调用(如InterfaceUtil.check(book1)),这里必须要注意。

推荐阅读