java自定义注解解析及自定义注解
生活随笔
收集整理的這篇文章主要介紹了
java自定义注解解析及自定义注解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
jdk1.5之后提供了注解(Annotation)這一種語法。其主要作用是編譯檢查(比如@override)和代碼分析(通過代碼中添加注解,利用注解解析器對添加了注解的代碼進行分析,獲取想要的結果,一般自定義的注解都是這一種功能)
一、JDK提供的常用注解(Override、Deprecated、SuppressWarnings)
- @Override
表示子類重寫了父類的方法,或者實現了接口的方法。幫助開發者確認子類是否正確的覆蓋了父類的方法,若父類中沒有此方法,編譯器即報錯。但是,子類與父類有同樣的方法,但子類的方法上沒有@Override注解,是不會報錯。
- @Deprecated
用于提示開發者,標注此注解的方法已經被棄用了。請使用另外推薦的方法
- @SuppressWarnings
抑制警告的意思。例如新建一個變量,但是沒有用,編譯器會提示此變量未使用的警告。如果在方法中,添加了@SuppressWarnings的相關注解,這個警告就不會再提示了。
完整架構:
二、自定義注解
除了java自帶的注解,也可以自定義注解,用于幫助為相關代碼打上標簽,然后我們在解析注解的邏輯中就可以通過這些標簽來完成相關的工作,比如,權限控制,日志等。
@Retention
//用于確定注解的生命周期。其有三個枚舉變量可選 public enum RetentionPolicy {/*** SOURCE級別表示代碼級別可見,經過編譯器編譯生成字節碼對象時,此注解就沒了。* 比如@override就是代碼級別可見*/SOURCE, /*** CLASS表示字節碼對象級別可見,但是字節碼對象被虛擬機加載時,* 這個注解會被拋棄,這是默認的可見級別*/CLASS,/*** RUNTIME表示運行時也可見,當虛擬機加載字節碼對象時,此注解仍然可見。* 因此可以通過反射獲取注解信息,然后完成相應的注解解析工作,一般自定義的注解都是運行時可見。*/RUNTIME }@Target
//用于修飾此注解可以用于什么類型上。比如注解可以用在類級別、方法、成員字段或者構造函數上。 public enum ElementType {/** 可以修飾類*/TYPE, /**可以修飾字段*/FIELD,/** 可以修飾方法*/METHOD,/** Formal parameter declaration */PARAMETER,/** 構造方法*/CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE }注意,注解的返回值只能是基本類型、Class、String、enum、Annotation 類型、以上所有類型的數組
上述定義的自定義注解,只是一個空的定義,沒有任何的意義。因此需要我們自己定義相關的自定義注解的解析。上面提到,自定義的注解需要定義注解的可見范圍。一般我們都定義為運行時可見。因此,通過反射,我們可以拿到注解的內容。通過反射拿到代碼的注解內容,進行相關的邏輯處理工作,以達到注解的目的。
//通過反射獲得注解內容的常用方法有: T getAnnotation(Class) : 獲得當前對象的指定的注解。 Annotation[] getAnnotations() X: 獲得當前對象的所有注解 boolean isAnnotationPresent(annotationClass): 當前對象是否有注解。球隊注解:
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface FootBallTeam {public String value() default "Guangzhou Evergrande Taobao Football Club"; } public class testAnnotation {public static void main(String[] args) {testAnnotation test = new testAnnotation();test.getInformation(Team.class);}public void getInformation(Class<?> clazz) {//因為注解是在成員字段上,因此需要獲得類的所有字段信息Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {//判斷這個字段上是否有相應的注解信息(FootBallTeam.class)if (field.isAnnotationPresent(FootBallTeam.class)) {FootBallTeam footBallTeam = field.getAnnotation(FootBallTeam.class);System.out.println("球隊名字是" + footBallTeam.value());}}} } class Team{@FootBallTeam("Real Madrid")private String teamName; }在spring中大量應用了注解結合反射機制,實現ioc、aop等功能,更多詳解看大佬文章。
總結
以上是生活随笔為你收集整理的java自定义注解解析及自定义注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 零售创新决胜新消费暨2021中国网络零售
- 下一篇: GET与POST