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);    //調用注解對應的方法
}

結果如下:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM