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

歡迎訪問 生活随笔!

生活随笔

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

java

Java注解(Annotation)详解

發布時間:2025/5/22 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java注解(Annotation)详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉:

Java注解(Annotation)詳解

幻海流心 2018.05.23 15:20 字數 1775 閱讀 380評論 0

Java注解(Annotation)詳解

1.Annotation的概念

An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.

  • 注解是一種可以添加到Java源代碼的元數據.
  • 類,方法,變量,參數,包都可以被注解.
  • 注解對注解的代碼并沒有直接的影響.
  • 注解僅僅是個標記.注解之所以起作用是對其解析后做了相應的處理

2.Annotation分類

  • 標準Annotation
    • 標準Annotation是指Java內置的三個Annnotaion:
    • @Override:用于修飾此方法覆蓋了父類的方法.
    • @Deprecated:用于修飾已經過時的方法.
    • @SuppressWarnnings:用于通知java編譯器禁止特定的編譯警告.
  • 元Annotation(注解的注解)
    • 元Annotation是用來定義Annotation的Annotation
    • 元Annotation可以定義Annotation的作用范圍,使用在什么元素上等
    • 元注解共有四種@Retention, @Target, @Inherited, @Documented
  • 自定義Annotation

3.元Annotation

  • @Retention:注在其他的注解A上,用來說明A的保留范圍,可選值 SOURCE(源碼時),CLASS(編譯時),RUNTIME(運行時),默認為 CLASS
    • SOURCE:A只保留在源碼中,A會被編譯期忽略.(源碼可用)
    • CLASS:A會通過編譯保存在CLASS文件中,但會被JVM在運行時忽略,運行時不可見.(源碼+CLASS可用)
    • RUNTIME:A會被JVM獲取,并在運行時通過反射獲取.(源碼+CLASS+運行時均可用)
  • @Target:注在其他的注解A上,用來限制A可用修飾那些程序元素.未標注Target表示無限制,可修飾所有元素.
    • ANNOTATION_TYPE: A可以應用到其他注解上
    • CONSTRUCTOR: A可以使用到構造器上
    • FIELD: A可以使用到域或屬性上
    • LOCAL_VARIABLE: A可以使用到局部變量上。
    • METHOD: A可以使用到方法上。
    • PACKAGE: A可以使用到包聲明上。
    • PARAMETER: A可以使用到方法的參數上
    • TYPE: A可以使用到類,接口(包括注解),或枚舉的聲明上
  • @Inherited:默認情況下,父類的注解不會被子類繼承.
    • Inherited注在其他的注解A上.
    • 只有當A是注解在類Class上面,Inherited才會起作用,其他任何情況下無效果.
    • 當A注解在類C上面,則C的所有子孫類,都會繼承應用A注解;
  • @Documented:注在其他的注解A上,A將會作為Javadoc產生的文檔中的內容。注解都默認不會成為成為文檔中的內容。

4.自定義Annotation

  • 創建自定義Annotation流程

    • public @interface 自定義注解名稱 public @interface CustomAnnotation{***}
    • 設置自定義Annotation的保留范圍和目標,Retention和Target是最重要的兩個元Anitation. @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{***}
    • 設置自定義Annotation的注解參數(注解成員)
      • 注解參數支持的數據類型
        • 所有基本數據類型(int,float,boolean,byte,double,char,long,short)
        • String類型
        • Class類型
        • enum類型
        • Annotation類型
        • 以上所有類型的一維數組
      • 注解參數聲明方式 @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{ //注解參數類型可以是1-6中任一種,包括枚舉 public enum Skill{JAVA,ANDROID,IOS} Skill mySkill() default Skill.ANDROID; String attr1(); //可以使用default設置默認值 int attr2() default 100; //修飾符只能用public public boolean attr3() default false; } @Retention( RetentionPolicy.RUNTIME ) @Target( ElementType.TYPE ) public @interface CustomAnnotation{ //只有一個注解參數,使用value() String value(); }
        • 自定義Annotation的參數類型必須滿足上一條1到6中的范圍.
        • 自定義Annotation的參數訪問方法只能是public,或不寫.
        • 自定義Annotation的參數可以加 default 設置默認值.
        • 自定義Annotation若只有1個參數,使用value().
  • 自定義Annotation的注解參數的默認值

    注解元素必須有確定的值,要么在定義注解的默認值中指定,要么在使用注解時指定,非基本類型的注解元素的值不可為null。因此, 使用空字符串或0作為默認值是一種常用的做法。這個約束使得處理器很難表現一個元素的存在或缺失的狀態,因為每個注解的聲明中,所有元素都存在,并且都具有相應的值,為了繞開這個約束,我們只能定義一些特殊的值,例如空字符串或者負數,一次表示某個元素不存在,在定義注解時,這已經成為一個習慣用法。

    示例: @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface AnotherAnnotation{ String author() default ""; int age() default -1; }
  • 使用剛剛創建的自定義注解

    @CustomAnnotation(attr1 = "屬性1", attr2 = 90, attr3 = true) public class AnnotationTestClass{ *** }
  • 5.Annotation解析

    • 運行時 Annotation 解析

      運行時 Annotation 指 @Retention 為 RUNTIME 的 Annotation
      - Class,Method,Field中都有以下3個方法可以調用
      - public <T extends Annotation> T getAnnotation(Class<T> annotationClass) 按照傳入的參數獲取指定類型的注解。返回null說明當前元素不帶有此注解。
      - public final boolean isAnnotationPresent(Class<? extends Annotation> annotationType) 檢查傳入的注解是否存在于當前元素。
      - public Annotation[] getAnnotations() 返回該元素的所有注解,包括沒有顯式定義該元素上的注解。
      - 運行時 Annotation 解析示例
      public void testCustomAnnotation() { try { Class cls = Class.forName("com.jet.annotation.AnnotationTestClass"); CustomAnnotation customAnnotation = (CustomAnnotation)cls.getAnnotation(CustomAnnotation.class); System.out.println("customAnnotation mySkill:" + cus.mySkill()); System.out.println("customAnnotation attr1:" + cus.attr1()); System.out.println("customAnnotation attr2:" + cus.attr2()); } catch (ClassNotFoundException e) { e.printStackTrace(); } }

    • 編譯時 Annotation 解析

      編譯時 Annotation 指 @Retention 為 CLASS 的 Annotation,甴編譯器自動解析


    6.編譯時Annotation解析

    編譯時Annotation解析 相對復雜,下面單獨進行分析

    首先申明:下面內容僅僅討論 編譯時Annotation的解析

  • 編譯時Annotation的解析,是由Annotation Processor完成
  • Annotation Processor(注解處理器)
    • 注解處理器是一個在javac中的,用來在編譯時掃描和處理注解的工具
    • 我們可以為特定的注解,注冊自定義的注解處理器
    • 在編譯期間,JVM會自動運行注冊過的注解處理器
    • 一個注解的Annotation Processor,以Java代碼(或者編譯過的class)為輸入,生成.java文件作為輸出.這意味著我們可以生成新的Java代碼!這些生成的Java代碼是在生成的.java文件中,新生成的.java文件會和普通的手動編寫的Java源代碼一樣被javac編譯
  • 每一個注解處理器都是繼承于AbstractProcessor,需要關注的有以下4個方法
  • public abstract class AbstractProcessor implements Processor { //對一些工具進行初始化 public synchronized void init(ProcessingEnvironment processingEnv) //你在這里定義你的注解處理器注冊到哪些注解上,必須指定; //它的返回值是一個字符串的集合,包含本處理器想要處理的注解類型的合法全稱 public Set<String> getSupportedAnnotationTypes() //指定該注解處理器使用的JAVA版本,通常返回SourceVersion.latestSupported() public SourceVersion getSupportedSourceVersion() //真正生成java代碼的地方 //annotations:請求處理的注解類型集合 //roundEnv:可以讓你查詢出包含特定注解的被注解元素,相當于“有關全局源碼的上下文環境” //如果返回 true,則這些注解已聲明并且不要求后續 Processor 處理它們; //如果返回 false,則這些注解未聲明并且可能要求后續 Processor 處理它們 public abstract boolean process(Set<? extends TypeElement> annotations,RoundEnvironment roundEnv) }
  • 自定義注解處理器,就是繼承AbstractProcessor并重寫上述4個方法
  • 關于編譯時Annotation解析,這里推薦一篇文章【Android】注解框架(三)-- 編譯時注解,手寫ButterKnife,按照文章上面流程敲一遍代碼,相信可以對自定義注解的創建及解析有一個深入的了解!

    轉載于:https://www.cnblogs.com/libin6505/p/11227101.html

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的Java注解(Annotation)详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 美女撒尿无遮挡网站 | 96av视频| 欧美xxxx性xxxxx高清 | 成人在线观看一区二区 | 国产精品一区二区久久 | 奇米精品一区二区三区在线观看 | 国产精品xxx在线观看 | 91丨九色丨丰满 | 在线播放亚洲 | 丁香网五月天 | 激情图片在线视频 | 热久久精品 | 亚洲香蕉在线观看 | 亚洲午夜激情 | 免费成人美女女电影 | 男女ss视频 | 国产精选91 | 日韩区在线| 97精品视频在线观看 | 精品人妻无码一区二区三 | 日韩一区二区三区在线免费观看 | 美女让男生桶 | 免费av网站大全 | 天天艹夜夜艹 | 精品欧美视频 | 色久在线 | 青青在线精品 | 69日本xxxxxxxxx30 在线波多野结衣 | 久久精品7| 91视频一区 | 久久精品综合 | 狠狠躁天天躁夜夜躁婷婷 | 1000部啪啪 | 国产精品骚 | 亚洲网在线观看 | 欧美日韩精选 | 欧美日韩中文字幕一区二区三区 | 国产大片黄 | 久久久亚洲欧洲 | 一区二区手机在线 | 操网站 | 国产一卡二卡在线播放 | 57pao国产精品一区 | 日本黄色免费看 | 痴女扩张宫交脱垂重口小说 | 日韩欧美综合 | av在线有码 | 少妇特殊按摩高潮惨叫无码 | 91新视频| 国产日韩欧美日韩大片 | 久久99久久99精品免观看粉嫩 | 亚洲色图欧美在线 | 国产精品区二区三区日本 | 天天想你免费观看完整版高清电影 | 狠狠v欧美v日韩v亚洲ⅴ | 69亚洲乱人伦| 美国少妇在线观看免费 | 亚洲一区二区中文 | 黄色在线观看视频网站 | 亚洲麻豆视频 | 91麻豆成人精品国产免费网站 | 精品少妇一区二区三区 | 国产人妻精品午夜福利免费 | 少妇全黄性生交片 | 欧美欧美欧美欧美 | 国产麻豆精品一区二区 | 一级国产片 | 69视频在线播放 | 色久视频| 国产又大又黄的视频 | 青青青手机视频在线观看 | 五月天黄色网 | 精品在线视频免费观看 | 国产成人午夜高潮毛片 | 欧洲一级黄色片 | 岛国一区二区 | 91亚洲精选| 国产极品福利 | 超碰77 | 成人亚洲玉足脚交系列 | 国产亚洲一区二区不卡 | 91国模| 老司机午夜av | 日韩精品在线免费观看 | 亚洲免费高清视频 | 亚洲色偷偷色噜噜狠狠99网 | 免费一区二区三区视频在线 | 波多野结衣在线免费观看视频 | 天堂va欧美ⅴa亚洲va一国产 | 婷婷麻豆 | 黄色在线观看国产 | 精品理论片 | av色图在线 | 天天干天天草 | 色导航| 亚洲国产无 | 午夜久久乐 | 中文av一区| 亚洲欧美一区二区三区不卡 |