国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

2021-12-30 21:43Java知音 Java教程

Java 注解(Annotation)又稱 Java 標注,是 JDK5.0 引入的一種注釋機制。重點:和 Javadoc 不同,Java 標注可以通過反射獲取標注內容。

前言

Java 注解(Annotation)又稱 Java 標注,是 JDK5.0 引入的一種注釋機制。重點:和 Javadoc 不同,Java 標注可以通過反射獲取標注內容。

大話空話不用說太多,簡而言之,在編譯器生成類文件時,標注 可以被嵌入到字節碼中。Java 虛擬機可以保留標注內容,在運行時可以獲取到標注內容 。當然它也支持自定義 Java 標注。反射+注解,是不是感覺Java變成一種動態語言?哈哈哈!

我覺得注解可以分為三個部分來講:內置注解,元注解,自定義注解。

一、內置注解

1、@Override 重寫

概念:檢查該方法是否是重寫方法。如果發現其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。

  1. //這個extends 不要在意,我寫上去只是為了更加方便直觀的去理解,Object是萬物之源,不寫也會默認是其子類,不用解釋過多吧?
  2. public class Annotation1 extends Object{
  3. @Override
  4. public String toString (){
  5. return "我是重新定義過的toString方法";
  6. }
  7. }

@Override(重寫),這個大家應該很熟悉,重寫父類的方法。我們可以看下Object類中toString()是什么樣子的。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

那么顯而易見,使用了@Override(重寫)注解,方法名、方法參數必須得和父類保持一致,否則會報錯。如下圖所示:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

如果不加@Override(重寫)注解,則正常編譯。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

2、@Deprecated 過期警告

概念:標記過時方法。如果使用該方法,會報編譯警告。在開發中,我們經常能遇到這樣的情況,如下圖:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

在jdk中有大量這樣的方法,我就不舉例了,自己寫一個可能會更加方便理解。

  1. public class Annotation1 extends Object{
  2. public static void main(String[] args) {
  3. testDeprecated.toString1();
  4. }
  5. }
  6. class testDeprecated {
  7. @Deprecated
  8. public static String toString1(){
  9. return "我是重新定義過的toString方法";
  10. }
  11. }

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

注意點:這個不是報錯,只是警告,提醒我們這個方法可能會有問題,可能有更好的方法來實現!

3、@SuppressWarnings 忽略警告

概念:指示編譯器去忽略注解中聲明的警告。

平時開發中,我們會遇到這樣的情況,如下圖:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

這也不是錯誤,這是提醒我們,該方法沒有使用到,警告提醒的作用。加上@SuppressWarnings注解后。

  1. public class Annotation1 extends Object{
  2. public static void main(String[] args) {
  3. }
  4. @SuppressWarnings("all")
  5. public static void testSuppressWarnings(){
  6. System.out.println("測試+testSuppressWarnings忽略警告!");
  7. }
  8. }

方法成功高亮起來,并且沒有警告提示了!

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

我們可以點進去看下這個注解為什么需要參數?

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

看這里,這個不是方法哦,這是參數。

在注解中的參數格式:calss + 參數名 + ()!這個需要強行記憶哦,回頭我們自定義注解時也需要用到。換一種寫法加深理解!如下圖:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

注意點:當注解中只有一個參數時,我們無需加上參數名,注解會自動幫我們匹配的。

二、元注解

概念:顧名思義,元注解就是給注解使用的注解!

1、@Retention 作用域-(常用)

概念:表示在什么級別保存該注解信息。在實際開發中,我們一般都寫RUNTIME,除非項目有特殊需求!我們看下@Retention的源碼。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

可以看到,需要一個參數,進參數瞅瞅。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

  • SOURCE:源代碼時有用。
  • CLASS:class文件中有用,但會被jvm丟棄。
  • RUNTIME:運行時有用。
  • 關系:RUNTIME>CLASS>SOURCE

后面我們自定義注解時,每個都需要用該注解!

2、@Documented 作用文檔

概念:將此注解包含在 javadoc 中 ,它代表著此注解會被javadoc工具提取成文檔。

老規矩看下源碼:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

無參的注解,作用域為RetentionPolicy.RUNTIME,運行時有用!這個只是用來作為標記,了解即可,在實際運行后會將該注解寫入javadoc中,方便查看。

3、@Target 目標-(常用)

概念:標記這個注解應該是使用在哪種 Java 成員上面!

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

參數源碼:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

注意這里是數組格式的參數,證明可以傳多個值。

  • @Target(ElementType.TYPE)——接口、類、枚舉、注解
  • @Target(ElementType.FIELD)——字段、枚舉的常量
  • @Target(ElementType.METHOD)——方法
  • @Target(ElementType.PARAMETER)——方法參數
  • @Target(ElementType.CONSTRUCTOR) ——構造函數
  • @Target(ElementType.LOCAL_VARIABLE)——局部變量
  • @Target(ElementType.ANNOTATION_TYPE)——注解
  • @Target(ElementType.PACKAGE)——包

我們來試一下:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

目標不對會報錯的哦!我們將其改成方法上!編譯即正常通過。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

其他的作用域大家可以去自行嘗試,篇幅問題,無法做到每個都去試一遍!

4、@Inherited 繼承

概念:標記這個注解是繼承于哪個注解類(默認 注解并沒有繼承于任何子類)。

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

這個很簡單,就是當@InheritedAnno注解加在某個類A上時,假如類B繼承了A,則B也會帶上該注解。

5、新注解-(了解即可)

從 Java 7 開始,額外添加了 3 個注解:

  • @SafeVarargs - Java 7 開始支持,忽略任何使用參數為泛型變量的方法或構造函數調用產生的警告。
  • @FunctionalInterface - Java 8 開始支持,標識一個匿名函數或函數式接口。
  • @Repeatable - Java 8 開始支持,標識某注解可以在同一個聲明上使用多次。

三、自定義注解

我們來定義一個屬于自己的注解。

  1. @Retention(value = RetentionPolicy.RUNTIME)
  2. @Target(value = ElementType.METHOD)
  3. @Inherited
  4. @interface myAnnotation {
  5. String name() default "";
  6. int age() default 18;
  7. String like();
  8. String IDCard() default "";
  9. }

格式:修飾符(pulic)+ @interface +注解名+ {參數等}

可利用default 設置默認值,設定了默認值后使用注解時不傳值也不會報錯,反之報錯!

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

我們只需要傳沒有默認值的參數即可。

如果不傳則報錯:

玩轉Java注解:元注解、內置注解、自定義注解的原理和實現

總結

主要就是要注意元注解的使用,因為我們自定義注解時必須得用到!其實注解主要配合反射來用,在此就不展開來敘述了。

原文地址:https://mp.weixin.qq.com/s/F-I7FofDcbFIDeemtk0bsA

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 国产毛片一区二区 | 中文字幕亚洲综合久久久软件 | 成人免费在线播放 | 国产婷婷 | 亚洲国产精品久久久久久 | 久久综合av| 亚洲福利影院 | 精品一区二区久久 | 久久国产精品视频 | 色接久久| 精品国产乱码一区二区三区 | 欧美一区二区三区精品 | 亚洲精品国产第一综合99久久 | 亚洲三区在线观看 | 一区二区在线视频 | 成人aaa毛片 | 精品成人久久 | 成年免费观看 | 中文字幕精品一区二区三区精品 | 国产精品久久久久久久久 | 自由成熟xxxx色视频 | 国产精品极品美女在线观看免费 | 国产三级一区二区 | 狠狠干美女 | 亚洲国产一区二区三区四区 | 色视频在线 | 91最新| 毛片免费的 | av中文字幕第一页 | 久草社区 | 性色av一区二区三区 | 亚洲免费观看视频网站 | 欧美一级欧美三级在线观看 | 久久综合久久88 | 91久久精品一区二区二区 | 国产中文字幕在线看 | 日韩欧美国产一区二区 | 深夜精品 | 欧美成人精品一区二区男人看 | 日韩精品av一区二区三区 | 日韩一区二区三区在线观看 |