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

Java中的注解、元注解詳細(xì)解析

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

1.注解概述

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

2.注解分類

作用分類:

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

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

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

3.三種基本的Annotaton

3.1**@Override**

  • 限定某個(gè)方法,是重寫父類方法 , 該注解只能用于方法
  • 在子類中去實(shí)現(xiàn)父類的方法,就會(huì)在方法上有@Override注解,假如我們?cè)噲D去重寫eat方法名稱,會(huì)發(fā)現(xiàn)在編譯期就報(bào)錯(cuò)了,就說明該方法不是我們重寫其父類(eat)的方法

3.2**@Deprecated**

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

3.3**@SuppressWarnings**

  • 關(guān)于 SuppressWarnings 作用范圍是和你放置的位置相關(guān)。比如@SuppressWarnings 放置在 main 方法,那么抑制警告的范圍就是 main
  • 通過 @SuppressWarnings 的源碼可知,其注解目標(biāo)為類、字段、函數(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.元注解(重點(diǎn))

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

四種元注解:

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

4.1**@Documented**

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

4.2@Retention

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

三種值

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

注意: 我們常用的定義即是RetentionPolicy.RUNTIME,因?yàn)槲覀兪褂梅瓷鋪韺?shí)現(xiàn)的時(shí)候是需要從JVM中獲取class類對(duì)象并操作類對(duì)象的。

三個(gè)生命周期是 源碼階段 - > class類對(duì)象階段 - > Runtime運(yùn)行時(shí)階段。

4.3**@Target**

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

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

4.4**@Inherited**

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

5.自定義注解

格式:public @Interface 注解名 {

屬性列表/無屬性

}

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

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

2、String類型

3、枚舉類型

4、注解

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

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

注意:

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

6.注解的提取

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

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

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

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

public Annotation[] getAnnotations() {}

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

如果獲取到的 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 屬性默認(rèn)值為 -1,msg 屬性默認(rèn)值為 Hi
//因?yàn)橛心J(rèn)值,所以無需要再在 @TestAnnotation 后面的括號(hào)里面進(jìn)行賦值了,這一步可以省略
@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中的注解、元注解詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java中的注解、元注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

    Shiro安全框架的主要組件及認(rèn)證過程簡(jiǎn)介

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

    Java程序超時(shí)停止的實(shí)踐方案

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

    Netty如何自定義編碼解碼器

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

正蓝旗| 孝义市| 子洲县| 乐清市| 含山县| 安平县| 合作市| 甘孜| 五大连池市| 吕梁市| 吴忠市| 蒙城县| 庄河市| 吴忠市| 霍州市| 胶南市| 林周县| 交口县| 金乡县| 聂拉木县| 阿鲁科尔沁旗| 阿图什市| 冀州市| 济南市| 内黄县| 夏津县| 云和县| 温州市| 普陀区| 进贤县| 滨海县| 孝义市| 延长县| 旅游| 怀柔区| 阿勒泰市| 仁寿县| 汉川市| 阳泉市| 炎陵县| 丰城市|