【Java 注解】自定义注解 ( 注解解析 )
文章目錄
- 一、定義注解
- 二、使用注解
- 三、解析注解
- 四、通過注解對象獲取注解屬性的原理
在 【Java 注解】自定義注解 ( 注解屬性定義與賦值 ) 博客中講解了 注解屬性 ;
在 【Java 注解】自定義注解 ( 元注解 ) 博客中講解了注解中的元注解如何描述注解 ;
本篇博客開始講解注解在程序中如何進行 解析 和 使用 ;
注解中定義了 若干 注解屬性 , 那么就需要在某個階段 , 將 注解屬性 的值拿出來 , 在某個場合讓其發揮出作用 ;
解析注解 : 獲取 注解屬性 的值 ;
一、定義注解
定義一個注解 :
package annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/*** 描述 類名, 以及類名下的方法名* 該注解作用于類上* 注解保留到運行時*/ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Property {/*** 注解屬性 : 需要反射的類名* @return*/String name();/*** 注解屬性 : 需要反射的方法名* @return*/int age(); }二、使用注解
使用上述 Property 注解 :
@Property(name = "Tom", age = 18) public class Main {public static void main(String[] args) {} }三、解析注解
在 main 函數中解析 Main 類上的 @Property(name = "Tom", age = 18) 注解 ;
首先 , 獲取該 Main 類的字節碼對象 ; 在哪個類上添加了注解 , 就獲取哪個類的字節碼文件 ;
// 1. 獲取該 Main 類的字節碼對象, // 哪個類上添加了注解 , 就獲取哪個類的字節碼文件 Class<Main> clazz = Main.class;然后 , 獲取字節碼上的注解對象 , 通過調用 getAnnotation 獲取指定注解類型的對象 , 也可以調用 getAnnotations 方法 , 獲取作用在該字節碼類上的所有注解 ;
// 2. 獲取字節碼上的注解對象 Property propertyAnnotation = clazz.getAnnotation(Property.class);最后 , 從注解對象中 , 獲取注解屬性 , 調用 注解屬性 對應的抽象方法即可獲取 注解屬性 值 ;
// 3. 調用 注解對象 中的抽象方法, 獲取其返回值 // 注解的本質就是接口, 其中的注解屬性本質是 抽象方法 // 注解對象可以直接調用注解超抽象方法, // 是因為在內存中生成了該 注解 接口的子類對象, 實現了 name 和 age 方法 // 獲取注解屬性 name String name = propertyAnnotation.name(); // 獲取注解屬性 age int age = propertyAnnotation.age();System.out.println("注解屬性值 : name = " + name + " , age = " + age);完整代碼如下 :
package annotation;@Property(name = "Tom", age = 18) public class Main {public static void main(String[] args) {// 解析注解// 1. 獲取該 Main 類的字節碼對象,// 哪個類上添加了注解 , 就獲取哪個類的字節碼文件Class<Main> clazz = Main.class;// 2. 獲取字節碼上的注解對象Property propertyAnnotation = clazz.getAnnotation(Property.class);// 3. 調用 注解對象 中的抽象方法, 獲取其返回值// 注解的本質就是接口, 其中的注解屬性本質是 抽象方法// 注解對象可以直接調用注解超抽象方法,// 是因為在內存中生成了該 注解 接口的子類對象, 實現了 name 和 age 方法// 獲取注解屬性 nameString name = propertyAnnotation.name();// 獲取注解屬性 ageint age = propertyAnnotation.age();System.out.println("注解屬性值 : name = " + name + " , age = " + age);} }四、通過注解對象獲取注解屬性的原理
通過注解對象獲取注解屬性的原理 :
注解的本質就是接口, 其中的注解屬性本質是 抽象方法 , 注解對象可以直接調用注解超抽象方法 , 是因為在內存中生成了該 注解 接口的子類對象, 實現了 name 和 age 方法 , 返回值就是本類注解中的 注解屬性值 ;
在 Main 類上標注了 @Property(name = "Tom", age = 18) 注解 , 該 Main 類運行時 , 則在內存中生成的 注解 接口的子類對象 , 大概形式如下 :
public class PropertyImpl implements Property {@Overridepublic String name() {return "Tom";}@Overridepublic int age() {return 18;} }因此 , 通過注解屬性 , 調用 name 和 age 方法 , 可以獲取到注解的 注解屬性 值 ;
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Java 注解】自定义注解 ( 注解解析 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】Android 文件分享 F
- 下一篇: 【Java 注解】自定义注解 ( 使用注