最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的注解、元注解詳細解析

 更新時間:2023年11月28日 09:02:06   作者:四葉草  
這篇文章主要介紹了Java中的注解、元注解詳細解析,注解也叫元數(shù)據(jù),與類、接口、枚舉是在同一個層次,它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進行說明,注釋,需要的朋友可以參考下

1.注解概述

  • JDK5.0新增 — 注解(Annotation),也叫元數(shù)據(jù)。與類、接口、枚舉是在同一個層次,它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進行說明,注釋。
  • Annotation 可以像修飾符一樣被使用,可用于修飾包,類,構(gòu)造器,方法,成員變量,參數(shù),局部變量的聲明,這些信息被保存在Annotation的"name=value"對中。在JavaSE中,注解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/ArIdroid中注解占據(jù)了更重要的角色,例如用來配置應(yīng)用程序的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。未來的開發(fā)模式都是基于注解的,JPA(java的持久化API)是基于注解的,Spring2.5以后都是基于注解的,Hibernate3.x以后也是基于注解的,注解是一種趨勢,一定程度上可以說 :框架=注解+反射+設(shè)計模式。

2.注解分類

作用分類:

  • 編寫文檔: 通過代碼里標識的元數(shù)據(jù)生成文檔【生成文檔doc文檔】
  • 代碼分析: 通過代碼里標識的元數(shù)據(jù)對代碼進行分析【使用反射】
  • 編譯檢查: 通過代碼里標識的元數(shù)據(jù)讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override等】

注解可以根據(jù)注解參數(shù)分為三大類:

  • 標記注解: 沒有參數(shù)的注解,僅用自身的存在與否為程序提供信息,如@Override注解,該注解沒有參數(shù),用于表示當(dāng)前方法為重寫方法。
  • 單值注解: 只有一個參數(shù)的注解,如果該參數(shù)的名字為value,那么可以省略參數(shù)名,如 @SuppressWarnings(value = “all”),可以簡寫為@SuppressWarnings(“all”)。
  • 完整注解: 有多個參數(shù)的注解。

3.三種基本的Annotaton

3.1**@Override**

  • 限定某個方法,是重寫父類方法 , 該注解只能用于方法
  • 在子類中去實現(xiàn)父類的方法,就會在方法上有@Override注解,假如我們試圖去重寫eat方法名稱,會發(fā)現(xiàn)在編譯期就報錯了,就說明該方法不是我們重寫其父類(eat)的方法

3.2**@Deprecated**

  • 用于表示某個程序元素 ( 類 , 方法等,字段, 包, 參數(shù) ) 已過時
  • 已過時不是不能使用,只是不推薦使用,但是仍然可以使用

3.3**@SuppressWarnings**

  • 關(guān)于 SuppressWarnings 作用范圍是和你放置的位置相關(guān)。比如@SuppressWarnings 放置在 main 方法,那么抑制警告的范圍就是 main
  • 通過 @SuppressWarnings 的源碼可知,其注解目標為類、字段、函數(shù)、函數(shù)入?yún)?、?gòu)造函數(shù)和函數(shù)的局部變量。
  • @SuppressWarnings在IDEA中不明顯,在eclipse中有顯示黃色警告。

unchecked:未檢查的轉(zhuǎn)化,如集合沒有指定類型還添加元素
unused:未使用的變量
resource:有泛型未指定類型
path:在類路徑,原文件路徑中有不存在的路徑
deprecation:使用了某些不贊成使用的類和方法
fallthrough:switch語句執(zhí)行到底沒有break關(guān)鍵字
rawtypes:沒有寫泛型,比如: List list = new ArrayList();
all:全部類型的警告

4.元注解(重點)

  • 元注解是用于修飾其它注解的注解

四種元注解:

  • @Documented:指定了被修飾的注解是可以Javadoc等工具文檔化
  • @Retention:指定了被修飾的注解的生命周期
  • @Target:指定被修飾的注解的作用范圍
  • @Inherited:指定了被修飾的注解修飾程序元素的時候是可以被子類繼承的

4.1**@Documented**

  • 用于指定被該元注解修飾的注解類將被javadoc工具提取成文檔。默認情況下,javadoc是 不包括注解的,但是加上了這個注解生成的文檔中就會帶著注解了。
  • 定義為@Documented 的注解必須設(shè)置Retention值為RUNTIME。

4.2@Retention

只能用于修飾一個 Annotation 定義, 用于指定該 Annotation 可以保留多長時間,@Rentention 包含一個 RetentionPolicy 類型的成員變量, 使用 @Rentention 時必須為該 value 成員變量指定值(值有三種)。

三種值

  • RetentionPolicy.SOURCE: 編譯器使用后,直接丟棄這種策略的注釋。
  • RetentionPolicy.CLASS: 編譯器將把注解記錄在 class 文件中 . 當(dāng)運行 Java 程序時 , JVM 不會保留注解。 這是默認值。
  • RetentionPolicy.RUNTIME: 編譯器將把注解記錄在 class 文件中 . 當(dāng)運行 Java 程序時 , JVM 會保留注解 . 程序可以 通過反射獲取該注解。

注意: 我們常用的定義即是RetentionPolicy.RUNTIME,因為我們使用反射來實現(xiàn)的時候是需要從JVM中獲取class類對象并操作類對象的。

三個生命周期是 源碼階段 - > class類對象階段 - > Runtime運行時階段。

4.3**@Target**

用于修飾注解的注解,用于指定被修飾的注解能用于修飾哪些程序元素。@Target也包含一個名為value的成員變量。

ANNOTATION_TYPE 用于描述注解
CONSTRUCTOR 用于描述構(gòu)造方法
FIELD 用于描述屬性
LOCAL_VARIABLE 用于描述局部變量
METHOD 用于描述方法
PACKAGE 用于描述包
PARAMETER 用于描述方法內(nèi)的參數(shù)
TYPE 用于描述類型進行注解,比如類、接口、枚舉

4.4**@Inherited**

被它修飾的Annotation將具有繼承性。如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該注解。

5.自定義注解

格式:public @Interface 注解名 {

屬性列表/無屬性

}

注解體中的屬性要求(返回值類型):

1、基本數(shù)據(jù)類型

2、String類型

3、枚舉類型

4、注解

5、以上類型的數(shù)組

注解的屬性也叫做成員變量。注解只有成員變量,沒有方法。

注意:

  • 在這里不能有void的無返回值類型和以上類型以外的類型
  • 定義的屬性,在使用時需要給注解中的屬性賦值
  • 如果定義屬性時,使用default關(guān)鍵字給屬性默認初始化值,則使用注解時可以不為屬性賦值,它取的是默認值。如果為它再次傳入值,那么就發(fā)生了對原值的覆蓋。
  • 如果只有一個屬性需要賦值,并且屬性的名稱為value,則賦值時value可以省略,可以直接定義值
  • 數(shù)組賦值時,值使用{}存儲值。如果數(shù)組中只有一個值,則可以省略{ }

6.注解的提取

注解通過反射獲取。首先可以通過 Class 對象的 isAnnotationPresent() 方法判斷它是否應(yīng)用了某個注解

public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}

然后通過 getAnnotation() 方法來獲取 Annotation 對象,或者是 getAnnotations() 方法。。

public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}

public Annotation[] getAnnotations() {}

//前一種方法返回指定類型的注解,后一種方法返回注解到這個元素上的所有注解。

如果獲取到的 Annotation 如果不為 null,則就可以調(diào)用它們的屬性方法了。比如

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
 
    public int id() default -1;
 
    public String msg() default "Hi"; 
    
}
//TestAnnotation 中 id 屬性默認值為 -1,msg 屬性默認值為 Hi
//因為有默認值,所以無需要再在 @TestAnnotation 后面的括號里面進行賦值了,這一步可以省略
@TestAnnotation()
public class Test {
 
    public static void main(String[] args) {
 
        boolean hasAnnotation = Test.class.isAnnotationPresent(TestAnnotation.class);
 
        if ( hasAnnotation ) {
            TestAnnotation testAnnotation = Test.class.getAnnotation(TestAnnotation.class);
 
            System.out.println("id:"+testAnnotation.id());
            System.out.println("msg:"+testAnnotation.msg());
        }
 
    }
 
}

到此這篇關(guān)于Java中的注解、元注解詳細解析的文章就介紹到這了,更多相關(guān)Java中的注解、元注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析springsecurity入門登錄授權(quán)

    深入淺析springsecurity入門登錄授權(quán)

    SpringSecurity為我們提供了基于注解的權(quán)限控制方案,這也是我們項目中主要采用的方式,我們可以使用注解去指定訪問對應(yīng)的資源所需的權(quán)限,這篇文章主要介紹了springsecurity入門登錄授權(quán),需要的朋友可以參考下
    2024-05-05
  • Java 選擇、冒泡排序、折半查找(實例講解)

    Java 選擇、冒泡排序、折半查找(實例講解)

    下面小編就為大家?guī)硪黄狫ava 選擇、冒泡排序、折半查找(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Shiro安全框架的主要組件及認證過程簡介

    Shiro安全框架的主要組件及認證過程簡介

    這篇文章主要介紹了Shiro安全框架的主要組件及認證過程簡介,Shiro?是一個強大靈活的開源安全框架,可以完全處理身份驗證、授權(quán)、加密和會話管理,本文就來介紹一下此框架的核心組成,需要的朋友可以參考下
    2023-08-08
  • Java程序超時停止的實踐方案

    Java程序超時停止的實踐方案

    本文探討了多種在Java中控制任務(wù)執(zhí)行時間的方法,分析了不同方案的優(yōu)缺點,介紹了基于時間循環(huán)控制的基礎(chǔ)實現(xiàn)及其局限性,詳細講解了線程中斷機制,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Netty如何自定義編碼解碼器

    Netty如何自定義編碼解碼器

    Netty自定義編碼解碼器:InboundHandler處理入棧數(shù)據(jù),OutboundHandler處理出棧數(shù)據(jù),解碼器繼承ByteToMessageDecoder,編碼器繼承MessageToByteEncoder,ReplayingDecoder簡化了解碼邏輯,但可能因異常重試導(dǎo)致性能下降
    2025-03-03
  • Mybatis CURD及模糊查詢功能的實現(xiàn)

    Mybatis CURD及模糊查詢功能的實現(xiàn)

    這篇文章主要介紹了Mybatis CURD及模糊查詢功能的實現(xiàn),有查詢刪除,插入,更新功能,通過實例代碼講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-06-06
  • 詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件

    詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件

    這篇文章主要介紹了詳解如何將JAVA程序制作成可以直接執(zhí)行的exe文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java封裝類型與基礎(chǔ)類型對比示例分析

    java封裝類型與基礎(chǔ)類型對比示例分析

    這篇文章主要為大家介紹了java封裝類型與基礎(chǔ)類型對比示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • JPA原生SQL實現(xiàn)增刪改查的示例詳解

    JPA原生SQL實現(xiàn)增刪改查的示例詳解

    JPA除了對JPQL提供支持外,還對原生SQL語句也提供了支持。本文將利用生SQL實現(xiàn)增刪改查功能,文中的示例代碼講解詳細,需要的可以參考一下
    2022-09-09
  • SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例

    SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例

    這篇文章主要介紹了SpringMvc靜態(tài)資源訪問實現(xiàn)方法代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

许昌市| 徐汇区| 勐海县| 开鲁县| 仁化县| 黄石市| 西华县| 上饶县| 锡林浩特市| 定安县| 和田市| 潞城市| 得荣县| 黔西县| 太仓市| 板桥市| 涿鹿县| 五常市| 沂南县| 雷州市| 绵阳市| 九江县| 灵川县| 栖霞市| 青神县| 志丹县| 博客| 潞城市| 靖江市| 房山区| 锡林浩特市| 儋州市| 桑植县| 桐柏县| 班戈县| 肥东县| 抚远县| 阳原县| 射阳县| 天峻县| 论坛|