不說廢話,直接進入正題:
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)),這里必須要注意。