1.9 通过反射获取注解信息
使用注解修飾了類、方法、變量等成員之后,這些注解不會自己生效,必須由開發者提供相應的工具來提取處理。要想獲取類、方法或變量的注解信息,必須通過 Java 的反射技術來獲取 Annotation 對象,除此之外沒有其它方法。
下面主要介紹 Java 基于反射機制獲取注解的方法,并以結合實例的方式講解了獲取注解信息的具體實現方法與操作事項。
所有 Java 注解類型都繼承于 java.lang.annotation.Annotation 接口,該接口代表程序中可以接收注解的程序元素。該接口主要有如下幾個實現類。
- Class:類定義。
- Constructor:構造方法定義。
- Field:類的成員變量定義。
- Method:類的方法定義。
- Package:類的包定義。
java.lang.reflect 包下主要包含一些實現反射功能的工具類,從 Java 5 開始,java.lang.reflect 包所提供的反射 API 增加了讀取運行時注解的能力。只有當定義注解時使用了 @Retention(RetentionPolicy.RUNTIME) 修飾,該注解才會在運行時可見。
AnnotatedElement 接口是所有程序元素(如 Class、Method、Constructor 等)的父接口,所以程序通過反射獲取了某個類的 AnnotatedElement 對象(如 Class、Method、 Constructor 等)之后,程序就可以調用該對象的如下幾個方法來訪問注解信息,方法名稱及作用如下表所示。
根據官方的命名規則,可以總結出以下幾條:
注意:所有的方法都可以獲取直接注解信息
例? 1
在 SpringMVC 中,經常使用 @RequestMapping(value="") 注解,這樣 Spring 就會將我們填寫的 value 值當作路徑存放在 map 結構中讓我們訪問。下面我們使用 getAnnotation() 方法來實現這個功能,代碼如下。
創建 TestController 類,然后在 TestController 類中使用 @MyRequestMapping 注解,代碼如下:
@MyRequestMapping("/test") public class TestController {public void test() {System.out.println("進入Test方法");} }測試類代碼如下:
public class Test {public static void main(String[] args) {Class<?> c = TestController.class;MyRequestMapping baseRequestMapping = c.getAnnotation(MyRequestMapping.class);System.out.println(baseRequestMapping.value()); // 輸出value的值} }輸出結果為
/test。
注意:Class<?> 中的 <?> 是必須寫的,你可以把?改成要限定的類型,但是必須要寫這個泛型限定才行,否則會編譯錯誤。
例 2
下面我們使用 getAnnotations() 方法獲取多個注解,并輸出。
1)自定義 Person 注解,代碼如下:
@Target({ ElementType.TYPE }) @Inherited @Retention(RetentionPolicy.RUNTIME) public @interface Person {String value(); }2)修改例 1 中的 TestController 類,代碼如下:
@MyRequestMapping("/test") @Person("C") public class TestController {public void test() {System.out.println("進入Test方法");} }3)創建測試類,獲取 TestController 類里的所有注解,并將這些注解打印出來。代碼如下所示:
public class Test {public static void main(String[] args) {Class<?> c = TestController.class;Annotation[] atnsArray = c.getAnnotations();for (Annotation an : atnsArray) {System.out.println(an);}} }輸出結果為:
@MyRequestMapping(value=/test)
@Person(value=C)
總結
以上是生活随笔為你收集整理的1.9 通过反射获取注解信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.8 自定义注解
- 下一篇: ==与equals,String的equ