欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.注解概述

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

2.注解分類

作用分類:

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

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

  • 標(biāo)記注解: 沒(méi)有參數(shù)的注解,僅用自身的存在與否為程序提供信息,如@Override注解,該注解沒(méi)有參數(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ò)了,就說(shuō)明該方法不是我們重寫其父類(eat)的方法

3.2**@Deprecated**

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

3.3**@SuppressWarnings**

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

unchecked:未檢查的轉(zhuǎn)化,如集合沒(méi)有指定類型還添加元素
unused:未使用的變量
resource:有泛型未指定類型
path:在類路徑,原文件路徑中有不存在的路徑
deprecation:使用了某些不贊成使用的類和方法
fallthrough:switch語(yǔ)句執(zhí)行到底沒(méi)有break關(guān)鍵字
rawtypes:沒(méi)有寫泛型,比如: 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ì)保留注解 . 程序可以 通過(guò)反射獲取該注解。

注意: 我們常用的定義即是RetentionPolicy.RUNTIME,因?yàn)槲覀兪褂梅瓷鋪?lái)實(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 注解名 {

屬性列表/無(wú)屬性

}

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

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

2、String類型

3、枚舉類型

4、注解

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

注解的屬性也叫做成員變量。注解只有成員變量,沒(méi)有方法。

注意:

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

6.注解的提取

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

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

然后通過(guò) getAnnotation() 方法來(lái)獲取 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)值,所以無(wú)需要再在 @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)文章

  • EL調(diào)用Java方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    EL調(diào)用Java方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    簡(jiǎn)單來(lái)說(shuō),我們?cè)谝粋€(gè)類中的某個(gè)方法,可以使用EL進(jìn)行調(diào)用,這個(gè)能被EL表達(dá)式調(diào)用的方法稱之為EL函數(shù),但是這種方式必須滿足兩點(diǎn)要求,具體哪兩點(diǎn),大家可以參考下本文
    2017-07-07
  • Java中Map實(shí)現(xiàn)線程安全的3種方式

    Java中Map實(shí)現(xiàn)線程安全的3種方式

    本文主要介紹了Java中Map實(shí)現(xiàn)線程安全的3種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 關(guān)于Java大整數(shù)運(yùn)算之BigInteger類

    關(guān)于Java大整數(shù)運(yùn)算之BigInteger類

    這篇文章主要介紹了關(guān)于Java大整數(shù)運(yùn)算之BigInteger類,BigInteger提供高精度整型數(shù)據(jù)類型及相關(guān)操作,所有操作中,都以二進(jìn)制補(bǔ)碼形式表示,需要的朋友可以參考下
    2023-05-05
  • java 將方法作為傳參--多態(tài)的實(shí)例

    java 將方法作為傳參--多態(tài)的實(shí)例

    下面小編就為大家?guī)?lái)一篇java 將方法作為傳參--多態(tài)的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 用Spring將Service注入到Servlet中的流程步驟

    用Spring將Service注入到Servlet中的流程步驟

    在Java Web開(kāi)發(fā)中,??Servlet??是一個(gè)非常重要的組件,它用于處理客戶端的請(qǐng)求并生成響應(yīng),而?Spring??框架則是一個(gè)廣泛使用的依賴注入框架,可以幫助開(kāi)發(fā)者管理應(yīng)用中的對(duì)象及其依賴關(guān)系,本文將介紹如何使用Spring框架將Service層的對(duì)象注入到Servlet中
    2025-01-01
  • spring事務(wù)的REQUIRES_NEW源碼示例解析

    spring事務(wù)的REQUIRES_NEW源碼示例解析

    這篇文章主要為大家介紹了spring事務(wù)的REQUIRES_NEW源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Mybatis 動(dòng)態(tài)sql的編寫與開(kāi)啟二級(jí)緩存

    Mybatis 動(dòng)態(tài)sql的編寫與開(kāi)啟二級(jí)緩存

    二級(jí)緩存是Mapper級(jí)別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper中的SQL語(yǔ)句,則這些SqlSession可以共享二級(jí)緩存,即二級(jí)緩存是跨SqlSession的,這篇文章主要介紹了Mybatis 動(dòng)態(tài)sql的編寫|開(kāi)啟二級(jí)緩存,需要的朋友可以參考下
    2023-02-02
  • Spring Boot配置AOP打印日志的全過(guò)程

    Spring Boot配置AOP打印日志的全過(guò)程

    這篇文章主要給大家介紹了關(guān)于Spring Boot配置AOP打印日志的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Spring Boot如何讀取自定義外部屬性詳解

    Spring Boot如何讀取自定義外部屬性詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何讀取自定義外部屬性的相關(guān)資料,這個(gè)功能實(shí)現(xiàn)介紹的很詳細(xì),需要的朋友可以參考下
    2021-05-05
  • springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論