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