Java如何快速獲取類附帶的註解
作者:
轉載標誌 【2018-01-04】
更新日誌
日期 | 更新內容 | 備註 |
---|---|---|
2018-01-04 | 建立分析文件 | java技術乾貨分享 |
Java技術乾貨分享
如何快速獲取或者判斷一個類是否有某個註解呢?可以使用物件的Class資訊來獲取,下面是一個例子:
public class AnnotationDemo { public static boolean hasAnnotation(AnnotatedElement element, Class extends Annotation> annotationType) { if (element.isAnnotationPresent(annotationType)) { return true; } return false; } public static void main(String[] args) { Annotations annotations = new Annotations(); Class> cls = annotations.getClass(); if (hasAnnotation(cls, AnnotationTestA.class)) { System.out.println("Annotation Test A"); } if (hasAnnotation(cls, AnnotationTestB.class)) { System.out.println("Annotation Test B"); } if (hasAnnotation(cls, AnnotationTestC.class)) { System.out.println("Annotation Test C"); } } }@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@interface AnnotationTestA {}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@interface AnnotationTestB {}@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@interface AnnotationTestC {}@AnnotationTestA@AnnotationTestB@AnnotationTestCclass Annotations {}
在上面的例子中,hasAnnotation方法的作用就是判斷是否一個物件所屬的類包含某個註解,可以分析一下具體的實現,首先,第一個引數型別為AnnotatedElement,代表具體需要判斷的物件Class資訊,需要注意的是,Class類實現了AnnotatedElement介面,所以傳遞一個Class物件給這個方法的第一個引數是合法的;第二個引數是註解類的Class資訊,是需要檢測的目標註解。可以看到,在程式碼中使用了AnnotatedElement的isAnnotationPresent方法來進行判斷是否具有某個註解的功能,可以跟進去看一下具體的實現原理。
default boolean isAnnotationPresent(Class extends Annotation> annotationClass) { return getAnnotation(annotationClass) != null; } public
可以看一下annotationData方法的具體實現,參考下面的圖片:
其中首先會判斷是否具有需要的資料,以及是否符合要求,如果資料不存在或者過期了,那麼就需要重新獲取,重新獲取資料的關鍵方法是createAnnotationData,該方法的實現可以參考下面的程式碼:
annotationData方法獲取到的是一個AnnotationData物件,可以看一下AnnotationData類的定義:
// annotation data that might get invalidated when JVM TI RedefineClasses() is called private static class AnnotationData { final Map, Annotation> annotations; final Map , Annotation> declaredAnnotations; // Value of classRedefinedCount when we created this AnnotationData instance final int redefinedCount; AnnotationData(Map , Annotation> annotations, Map , Annotation> declaredAnnotations, int redefinedCount) { this.annotations = annotations; this.declaredAnnotations = declaredAnnotations; this.redefinedCount = redefinedCount; } }
在getAnnotation方法中,該方法獲取了AnnotationData欄位的annotations欄位來判斷是否包含目標註解,更加深入的細節可以自行參考Class類的具體實現。本文是一個極短的java技術分享,提供一種獲取一個物件的註解資訊的思路,其實還有很多型別資訊都是可以透過Class來獲取到的,這方面的內容可以挖掘很多,日後會多往這方面做文章。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1806/viewspace-2809634/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Springboot專案中 如何獲取@Configuration註解標註的配置類Spring Boot
- 如何獲取java類中的欄位修飾符?Java
- 透過JPA註解獲取某個類主鍵欄位
- Java service層獲取HttpServletRequest的工具類JavaHTTPServlet
- 揭秘Java反射:如何輕鬆獲取類的屬性及父類屬性Java反射
- PHP 獲取不帶名稱空間的類名PHP
- Day69.註解&列舉類的複習 -Java註解&列舉類Java
- 如何獲取微信的版本號詳解【附完整原始碼】原始碼
- Java實現獲取本機Ip的工具類Java
- java動態獲取實體類的欄位Java
- java獲取專案路徑工具類Java
- Java註解-後設資料、註解分類、內建註解和自定義註解Java
- 為什麼獲取不到@Value註解值?
- Java列舉類、註解和反射Java反射
- Java 如何優雅的使用註解Java
- java 匿名 泛型 獲取真實類名Java泛型
- Java 獲取Word批註所標記的文字和圖片Java
- Java知識點總結(反射-獲取類的資訊)Java反射
- phpstrom 註冊碼獲取PHP
- [20231115]如何快速獲取AWR中涉及到的表.txt
- 智慧名片CRM系統是如何快速獲取客戶的?
- PHP --反射 --獲取類的方法PHP反射
- 獲取類名稱的方法
- 註解類
- java中如何自定義註解Java
- Java中的註解-自定義註解Java
- Java如何獲取當前執行緒Java執行緒
- java獲取到heapdump檔案後,如何快速分析?Java
- Java列舉類與註解詳解——一篇文章讀懂列舉類與註解詳Java
- Java String類,字串常量池,建立方法,字串的獲取,擷取,轉換,分割。Java字串
- springboot:使用非同步註解@Async獲取執行結果的坑Spring Boot非同步
- Java註解的使用Java
- 如何用Java獲取當前時間戳?Java時間戳
- 如何獲取 Android CPU 核心數 (Java/C++)AndroidJavaC++
- java程式碼自動生成帶swagger3註解JavaSwagger
- Spring Boot配置類的註解Spring Boot
- 註解 javaJava
- java註解Java