日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java 注解】自定义注解 ( 注解解析 )

發布時間:2025/6/17 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 注解】自定义注解 ( 注解解析 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。