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

Java 什么是注解及注解原理詳細(xì)介紹

 更新時(shí)間:2016年12月31日 10:28:09   投稿:lqh  
這篇文章主要介紹了Java 注解的原理實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Java 注解的原理

java : 注解使用,http://www.dbjr.com.cn/article/101747.htm

什么是注解

注解也叫元數(shù)據(jù),例如我們常見的@Override和@Deprecated,注解是JDK1.5版本開始引入的一個(gè)特性,用于對(duì)代碼進(jìn)行說明,可以對(duì)包、類、接口、字段、方法參數(shù)、局部變量等進(jìn)行注解。它主要的作用有以下四方面:

  • 生成文檔,通過代碼里標(biāo)識(shí)的元數(shù)據(jù)生成javadoc文檔。
  • 編譯檢查,通過代碼里標(biāo)識(shí)的元數(shù)據(jù)讓編譯器在編譯期間進(jìn)行檢查驗(yàn)證。
  • 編譯時(shí)動(dòng)態(tài)處理,編譯時(shí)通過代碼里標(biāo)識(shí)的元數(shù)據(jù)動(dòng)態(tài)處理,例如動(dòng)態(tài)生成代碼。
  • 運(yùn)行時(shí)動(dòng)態(tài)處理,運(yùn)行時(shí)通過代碼里標(biāo)識(shí)的元數(shù)據(jù)動(dòng)態(tài)處理,例如使用反射注入實(shí)例。

一般注解可以分為三類:

一類是Java自帶的標(biāo)準(zhǔn)注解,包括@Override、@Deprecated和@SuppressWarnings,分別用于標(biāo)明重寫某個(gè)方法、標(biāo)明某個(gè)類或方法過時(shí)、標(biāo)明要忽略的警告,用這些注解標(biāo)明后編譯器就會(huì)進(jìn)行檢查。

一類為元注解,元注解是用于定義注解的注解,包括@Retention、@Target、@Inherited、@Documented,@Retention用于標(biāo)明注解被保留的階段,@Target用于標(biāo)明注解使用的范圍,@Inherited用于標(biāo)明注解可繼承,@Documented用于標(biāo)明是否生成javadoc文檔。

一類為自定義注解,可以根據(jù)自己的需求定義注解,并可用元注解對(duì)自定義注解進(jìn)行注解。

注解原理:

看看在Java的大體系下面是如何對(duì)注解的支持的。還是回到上面自定義注解的例子,對(duì)于注解Test,如下,如果對(duì)AnnotationTest類進(jìn)行注解,則運(yùn)行時(shí)可以通過AnnotationTest.class.getAnnotation(Test.class)獲取注解聲明的值,從上面的句子就可以看出,它是從class結(jié)構(gòu)中獲取出Test注解的,所以肯定是在某個(gè)時(shí)候注解被加入到class結(jié)構(gòu)中去了。

@Test("test") 
public class AnnotationTest { 
public void test(){ 
} 
}

從java源碼到class字節(jié)碼是由編譯器完成的,編譯器會(huì)對(duì)java源碼進(jìn)行解析并生成class文件,而注解也是在編譯時(shí)由編譯器進(jìn)行處理,編譯器會(huì)對(duì)注解符號(hào)處理并附加到class結(jié)構(gòu)中,根據(jù)jvm規(guī)范,class文件結(jié)構(gòu)是嚴(yán)格有序的格式,唯一可以附加信息到class結(jié)構(gòu)中的方式就是保存到class結(jié)構(gòu)的attributes屬性中。我們知道對(duì)于類、字段、方法,在class結(jié)構(gòu)中都有自己特定的表結(jié)構(gòu),而且各自都有自己的屬性,而對(duì)于注解,作用的范圍也可以不同,可以作用在類上,也可以作用在字段或方法上,這時(shí)編譯器會(huì)對(duì)應(yīng)將注解信息存放到類、字段、方法自己的屬性上。

在我們的AnnotationTest類被編譯后,在對(duì)應(yīng)的AnnotationTest.class文件中會(huì)包含一個(gè)RuntimeVisibleAnnotations屬性,由于這個(gè)注解是作用在類上,所以此屬性被添加到類的屬性集上。即Test注解的鍵值對(duì)value=test會(huì)被記錄起來。而當(dāng)JVM加載AnnotationTest.class文件字節(jié)碼時(shí),就會(huì)將RuntimeVisibleAnnotations屬性值保存到AnnotationTest的Class對(duì)象中,于是就可以通過AnnotationTest.class.getAnnotation(Test.class)獲取到Test注解對(duì)象,進(jìn)而再通過Test注解對(duì)象獲取到Test里面的屬性值。

這里可能會(huì)有疑問,Test注解對(duì)象是什么?其實(shí)注解被編譯后的本質(zhì)就是一個(gè)繼承Annotation接口的接口,所以@Test其實(shí)就是“public interface Test extends Annotation”,當(dāng)我們通過AnnotationTest.class.getAnnotation(Test.class)調(diào)用時(shí),JDK會(huì)通過動(dòng)態(tài)代理生成一個(gè)實(shí)現(xiàn)了Test接口的對(duì)象,并把將RuntimeVisibleAnnotations屬性值設(shè)置進(jìn)此對(duì)象中,此對(duì)象即為Test注解對(duì)象,通過它的value()方法就可以獲取到注解值。

Java注解實(shí)現(xiàn)機(jī)制的整個(gè)過程如上面所示,它的實(shí)現(xiàn)需要編譯器和JVM一起配合。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java中關(guān)于OAuth2.0的原理分析

    Java中關(guān)于OAuth2.0的原理分析

    這篇文章主要介紹了Java中關(guān)于OAuth2.0的原理分析,OAuth是一個(gè)關(guān)于授權(quán)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn),允許用戶授權(quán)第三 方應(yīng)用訪問他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方移動(dòng)應(yīng)用或分享他們數(shù)據(jù)的所有內(nèi)容,需要的朋友可以參考下
    2023-09-09
  • SpringBoot下如何實(shí)現(xiàn)支付寶接口的使用

    SpringBoot下如何實(shí)現(xiàn)支付寶接口的使用

    這篇文章主要介紹了SpringBoot下如何實(shí)現(xiàn)支付寶接口的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Spring AOP的五種通知方式代碼實(shí)例

    Spring AOP的五種通知方式代碼實(shí)例

    這篇文章主要介紹了Spring AOP的五種通知方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令大全(匯總)

    Java啟動(dòng)命令是所有java應(yīng)用程序的入口,通過它來啟動(dòng)Java運(yùn)行時(shí)環(huán)境,并加載相關(guān)的class,本文希望做一個(gè)Java啟動(dòng)命令的匯總,和各位同道分享,也便于日后作為自己的參考
    2023-09-09
  • 淺談SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    淺談SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式

    本文主要介紹了淺談SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式,主要包括CompletableFuture異步任務(wù),基于@Async異步任務(wù), TaskExecutor異步任務(wù),感興趣的可以了解一下
    2023-11-11
  • SpringAOP 構(gòu)造注入的實(shí)現(xiàn)步驟

    SpringAOP 構(gòu)造注入的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringAOP_構(gòu)造注入的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下
    2021-05-05
  • java使用poi生成excel的步驟

    java使用poi生成excel的步驟

    2010以上格式使用XSSFWorkBook對(duì)象, 2003格式使用HSSFWorkBook對(duì)象, 其他對(duì)象操作基本一樣,本文重點(diǎn)給大家介紹java使用poi生成excel的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2022-04-04
  • Java如何讀寫Properties配置文件(Properties類)

    Java如何讀寫Properties配置文件(Properties類)

    這篇文章主要介紹了Java如何讀寫Properties配置文件(Properties類),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java?NIO?通道概念選擇器使用示例詳解

    Java?NIO?通道概念選擇器使用示例詳解

    這篇文章主要為大家介紹了Java?NIO?通道概念選擇器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java并發(fā)容器之ConcurrentLinkedQueue詳解

    Java并發(fā)容器之ConcurrentLinkedQueue詳解

    這篇文章主要介紹了Java并發(fā)容器之ConcurrentLinkedQueue詳解,加鎖隊(duì)列的實(shí)現(xiàn)較為簡(jiǎn)單,這里就略過,我們來重點(diǎn)來解讀一下非阻塞隊(duì)列,
    從點(diǎn)到面, 下面我們來看下非阻塞隊(duì)列經(jīng)典實(shí)現(xiàn)類ConcurrentLinkedQueue,需要的朋友可以參考下
    2023-12-12

最新評(píng)論