1 在定義注解時我們會用到該注解:
@Retention(RetentionPolicy.RUNTIME)它有以下三個選項來說明它的生存周期。 2 /** 3 SOURCE級別表示代碼級別可見,經過編譯器編譯生成字節碼對象時,此注解就沒了。 4 * 比如@override就是代碼級別可見 5 */ 6 SOURCE, 7 8 /* 9 * CLASS表示字節碼對象級別可見,但是字節碼對象被虛擬機加載時, 10 * 這個注解會被拋棄,這是默認的可見級別 11 */ 12 CLASS, 13 14 /** 15 16 * RUNTIME表示運行時也可見,當虛擬機加載字節碼對象時,此注解仍然可見。 17 * 因此可以通過反射獲取注解信息,然后完成相應的注解解析工作,一般自定義的注解都是運行時可見。 18 */ 19 RUNTIME 20 21 /*現在我們定義一個注解*/ 22 23 import java.lang.annotation.ElementType; 24 import java.lang.annotation.Retention; 25 import java.lang.annotation.RetentionPolicy; 26 import java.lang.annotation.Target; 27 /*用來設置注解可以加到哪里*/ 28 @Target(ElementType.METHOD) 29 /*用來確定注解的生命周期*/ 30 @Retention(RetentionPolicy.RUNTIME) 31 public @interface TestAnnotationString { 32 String name() ; 33 String email() default "tjs"; 34 }
接下來我們創建使用該注解的類
1 public class TestAnnotation { 2 3 @TestAnnotationString(name="tjs") 4 public void out(){ 5 System.out.println("tjs"); 6 } 7 }
接下來我們來獲取某個類的方法或字段有幾個設置該注解
import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestAnnotationMain { public static void main(String[] args){ TestAnnotationMain util=new TestAnnotationMain(); util.getInfomation(TestAnnotation.class); } /* *這個方法用於注解的解析,其輸入是Class類型的對象。通過反射這個Class對象獲取相關的注解,進行注解的解析 */ public void getInfomation(Class<?>clazz){ //因為注解是在成員方法上,因此需要獲得類的所有方法信息 Method[] Methods = clazz.getMethods(); //如果注解是在成員字段上,因此需要獲得類的所有字段信息 Field[] filed22 = clazz.getFields(); for (Method field : Methods) { //判斷這個字段上是否有相應的注解信息(FruitName.class) if (field.isAnnotationPresent(TestAnnotationString.class)) { TestAnnotationString tjs = field.getAnnotation(TestAnnotationString.class); System.out.println("注釋"+field.getName()+" " +tjs.name()); } } } }
通過自定義注解還可以配合SpringMVC來判斷加某個注解的方法訪問不需要登錄,以及日志的的記錄。
本文參考自:https://blog.csdn.net/andyzhu_2005/article/details/81355399