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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java自定义注解解析及自定义注解

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java自定义注解解析及自定义注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jdk1.5之后提供了注解(Annotation)這一種語法。其主要作用是編譯檢查(比如@override)和代碼分析(通過代碼中添加注解,利用注解解析器對添加了注解的代碼進行分析,獲取想要的結果,一般自定義的注解都是這一種功能)

一、JDK提供的常用注解(Override、Deprecated、SuppressWarnings)

  • @Override
    表示子類重寫了父類的方法,或者實現了接口的方法。幫助開發者確認子類是否正確的覆蓋了父類的方法,若父類中沒有此方法,編譯器即報錯。但是,子類與父類有同樣的方法,但子類的方法上沒有@Override注解,是不會報錯。
class MyThread implements Callable<Integer>{//實現callable接口的方法@Overridepublic Integer call() throws Exception {return 200;} }
  • @Deprecated
    用于提示開發者,標注此注解的方法已經被棄用了。請使用另外推薦的方法
@Deprecatedpublic void call(){System.out.println("expired...");}

  • @SuppressWarnings
    抑制警告的意思。例如新建一個變量,但是沒有用,編譯器會提示此變量未使用的警告。如果在方法中,添加了@SuppressWarnings的相關注解,這個警告就不會再提示了。
@SuppressWarnings({"unused"})public static void main(String[] args){List<Integer>list=new ArrayList<>();}

完整架構:

二、自定義注解

除了java自帶的注解,也可以自定義注解,用于幫助為相關代碼打上標簽,然后我們在解析注解的邏輯中就可以通過這些標簽來完成相關的工作,比如,權限控制,日志等。

  • 語法
  • 1.定義一個自定義注解,與定義一個接口類似,只不過在interface前加是哪個@。 2.其內部可以添加屬性值,其屬性值的定義為:修飾符 返回值類型 屬性名() [default value]其中,修飾符只能用publicabstract。返回值為基本類型、字符串、枚舉、注解以及以上類型的一維數組。 3.定義自定義注解,還需要用到元注解,用于修飾自定義注解, 一般我們會用到兩個。@Retention@Target

    @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 }
  • 簡單的自定義注解例子
  • @Target({ElementType.METHOD,ElementType.TYPE})//這個注解可以修飾方法和類 @Retention(RetentionPolicy.RUNTIME)//可見范圍到運行時都可見。 public @interface LogRecord {/** 下面時候注解的屬性 **/ public String operationType() default ""; }

    注意,注解的返回值只能是基本類型、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自定义注解解析及自定义注解的全部內容,希望文章能夠幫你解決所遇到的問題。

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