java中注解的原理解析
1.什么是java注解
java 注解(Annotation)又稱 Java 標(biāo)注,是 JDK5.0 引入的一種注釋機(jī)制,可以理解為為某個(gè)東西(類,方法,字段。)
打個(gè)標(biāo)記的記號(hào),等要使用這個(gè)注解時(shí),可以通過反射獲取標(biāo)注里面的內(nèi)容。
2.注解原理
在編譯器生成類文件時(shí),標(biāo)注可以被嵌入到字節(jié)碼中。Java 虛擬機(jī)可以保留標(biāo)注內(nèi)容,在運(yùn)行時(shí)可以獲取到標(biāo)注內(nèi)容。
3.java內(nèi)置注解
1.@Override 重寫
2.@Deprecated 過期警告
3.@SuppressWarnings 忽略警告
等等
4.元注解和自定義注解
像程序員如何使用注解呢,肯定是自定義一個(gè)注解,那這個(gè)自定義注解編譯器怎么認(rèn)識(shí)呢,所以java提供一些元注解來解釋下自定義注解是什么。
舉個(gè)例子
自定義一個(gè)JobInfo注解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Inherited public @interface JobInfo { String jobName() default ""; }
元注解: @Retention 表示這個(gè)注解的作用域 ,告知編譯器這個(gè)JobInfo注解,在代碼什么級(jí)別保存該注解信息。
在實(shí)際開發(fā)中,我們一般都寫RUNTIME,當(dāng)然根據(jù)自己需求而定;
枚舉有
1.SOURCE:源代碼時(shí)保留
2.CLASS:class文件中保留
3.RUNTIME:運(yùn)行時(shí)保留
作用范圍—》 RUNTIME>CLASS>SOURCE
public enum RetentionPolicy { /** * Annotations are to be discarded by the compiler. */ SOURCE, /** * Annotations are to be recorded in the class file by the compiler * but need not be retained by the VM at run time. This is the default * behavior. */ CLASS, /** * Annotations are to be recorded in the class file by the compiler and * retained by the VM at run time, so they may be read reflectively. * * @see java.lang.reflect.AnnotatedElement */ RUNTIME }
元注解:@Documented 作用文檔 將此注解包含在 javadoc 中 ,它代表著此注解會(huì)被javadoc工具提取成文檔
元注解:@Target 標(biāo)記這個(gè)注解應(yīng)該是使用在哪種 Java 成員上面
public enum ElementType { /** Class, interface (including annotation type), or enum declaration */ TYPE, /** Field declaration (includes enum constants) */ FIELD, /** Method declaration */ METHOD, /** Formal parameter declaration */ PARAMETER, /** Constructor declaration */ CONSTRUCTOR, /** Local variable declaration */ LOCAL_VARIABLE, /** Annotation type declaration */ ANNOTATION_TYPE, /** Package declaration */ PACKAGE, /** * Type parameter declaration * * @since 1.8 */ TYPE_PARAMETER, /** * Use of a type * * @since 1.8 */ TYPE_USE }
- @Target(ElementType.TYPE)——接口、類、枚舉、注解
- @Target(ElementType.FIELD)——字段、枚舉的常量
- @Target(ElementType.METHOD)——方法
- @Target(ElementType.PARAMETER)——方法參數(shù)
- @Target(ElementType.CONSTRUCTOR) ——構(gòu)造函數(shù)
- @Target(ElementType.LOCAL_VARIABLE)——局部變量
- @Target(ElementType.ANNOTATION_TYPE)——注解
- @Target(ElementType.PACKAGE)——包
元注解@Inherited 表示繼承,比如類A上打了@JobInfo注解,那么類B繼承了類A,那么類B也可以拿到類A上的@JobInfo注解信息
其他元注解
- @SafeVarargs - Java 7 開始支持,忽略任何使用參數(shù)為泛型變量的方法或構(gòu)造函數(shù)調(diào)用產(chǎn)生的警告。
- @FunctionalInterface - Java 8 開始支持,標(biāo)識(shí)一個(gè)匿名函數(shù)或函數(shù)式接口。
- @Repeatable - Java 8 開始支持,標(biāo)識(shí)某注解可以在同一個(gè)聲明上使用多次。
5.總結(jié)
程序員要使用自定義注解,必須使用元注解標(biāo)識(shí)一些信息,告知編譯器這個(gè)自定義注解的一些信息,這樣編譯器才知道怎么去校驗(yàn)和保留該自定義注解信息到字節(jié)碼中
6.TODO
1.注解的使用(打標(biāo)記)
2.注解的獲?。ǐ@取注解標(biāo)記的信息,拿到這些信息做其他事情。)通常我們說一個(gè)注解的作用時(shí),說的是獲取這個(gè)注解打標(biāo)記的內(nèi)容然后干了什么事情,這個(gè)作用。
到此這篇關(guān)于java中注解的原理解析的文章就介紹到這了,更多相關(guān)java注解原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javaweb判斷當(dāng)前請求是否為移動(dòng)設(shè)備訪問的方法
這篇文章主要為大家詳細(xì)介紹了javaweb判斷當(dāng)前請求是否為移動(dòng)設(shè)備訪問的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解
這篇文章主要介紹了Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程,連續(xù)結(jié)構(gòu)和跳轉(zhuǎn)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)中常見的兩種基本數(shù)據(jù)結(jié)構(gòu),而我們本次的主角棧和隊(duì)列都 既可以使用使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)也可以使用連續(xù)結(jié)構(gòu)實(shí)現(xiàn)2023-04-04關(guān)于HashMap 并發(fā)時(shí)會(huì)引起死循環(huán)的問題解析
JDK1.8之前采用頭插,即在鏈表結(jié)構(gòu)上每次都把數(shù)據(jù)放在鏈表頭部。JDK1.8采用尾插方法,很多朋友在學(xué)習(xí)Java并發(fā)容器和框架時(shí),看到為什么要使用ConcurrentHashMap時(shí)不知道究其原因,今天小編通過本文給大家介紹下HashMap 并發(fā)死循環(huán)問題,一起看看吧2021-05-05springboot整合Dubbo與Feign的實(shí)現(xiàn)?(無注冊中心)
本文主要介紹了springboot整合Dubbo與Feign的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04升級(jí)springboot中spring框架的版本的實(shí)現(xiàn)方法
本文主要介紹了升級(jí)springboot中spring框架的版本的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08解決myBatis中openSession()自動(dòng)提交的問題
在學(xué)習(xí)MySQL過程中,發(fā)現(xiàn)插入操作自動(dòng)提交,問題原因可能是myBatis中的openSession()方法設(shè)置了自動(dòng)提交,或者是MySQL的默認(rèn)引擎設(shè)置為不支持事務(wù)的MyISAM,解決辦法包括更改myBatis的提交設(shè)置或?qū)ySQL表的引擎改為InnoDB2024-09-09Java數(shù)組實(shí)現(xiàn)動(dòng)態(tài)初始化的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于Java數(shù)組實(shí)現(xiàn)動(dòng)態(tài)初始化的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-10-10java利用Apache commons codec進(jìn)行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
這篇文章主要介紹了java利用apache Commons包進(jìn)行MD5加密,BASE64加密解密與執(zhí)行系統(tǒng)命令希望對大家有用2017-12-12