java中注解的原理解析
1.什么是java注解
java 注解(Annotation)又稱 Java 標(biāo)注,是 JDK5.0 引入的一種注釋機制,可以理解為為某個東西(類,方法,字段。)
打個標(biāo)記的記號,等要使用這個注解時,可以通過反射獲取標(biāo)注里面的內(nèi)容。
2.注解原理
在編譯器生成類文件時,標(biāo)注可以被嵌入到字節(jié)碼中。Java 虛擬機可以保留標(biāo)注內(nèi)容,在運行時可以獲取到標(biāo)注內(nèi)容。
3.java內(nèi)置注解
1.@Override 重寫
2.@Deprecated 過期警告
3.@SuppressWarnings 忽略警告
等等
4.元注解和自定義注解
像程序員如何使用注解呢,肯定是自定義一個注解,那這個自定義注解編譯器怎么認識呢,所以java提供一些元注解來解釋下自定義注解是什么。
舉個例子
自定義一個JobInfo注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited
public @interface JobInfo {
String jobName() default "";
}元注解: @Retention 表示這個注解的作用域 ,告知編譯器這個JobInfo注解,在代碼什么級別保存該注解信息。
在實際開發(fā)中,我們一般都寫RUNTIME,當(dāng)然根據(jù)自己需求而定;
枚舉有
1.SOURCE:源代碼時保留
2.CLASS:class文件中保留
3.RUNTIME:運行時保留
作用范圍—》 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 中 ,它代表著此注解會被javadoc工具提取成文檔
元注解:@Target 標(biāo)記這個注解應(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ù)或函數(shù)式接口。
- @Repeatable - Java 8 開始支持,標(biāo)識某注解可以在同一個聲明上使用多次。
5.總結(jié)
程序員要使用自定義注解,必須使用元注解標(biāo)識一些信息,告知編譯器這個自定義注解的一些信息,這樣編譯器才知道怎么去校驗和保留該自定義注解信息到字節(jié)碼中
6.TODO
1.注解的使用(打標(biāo)記)
2.注解的獲?。ǐ@取注解標(biāo)記的信息,拿到這些信息做其他事情。)通常我們說一個注解的作用時,說的是獲取這個注解打標(biāo)記的內(nèi)容然后干了什么事情,這個作用。
到此這篇關(guān)于java中注解的原理解析的文章就介紹到這了,更多相關(guān)java注解原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐
h2是內(nèi)存數(shù)據(jù)庫,查詢高效,可以在開發(fā)初期使用它。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐,具有一定的參考價值,感興趣的可以了解一下2021-09-09
關(guān)于MyBatis Plus中使用or和and問題
這篇文章主要介紹了關(guān)于MyBatis Plus中使用or和and問題,需要的朋友可以參考下2020-12-12
idea創(chuàng)建Springboot多模塊項目(聚合項目)
文章詳細介紹了如何在idea創(chuàng)建Springboot多模塊項目(聚合項目),包括創(chuàng)建父工程和子工程、編輯pom.xml文件、編寫代碼和測試,還介紹了如何處理Maven視圖中的層級關(guān)系,并展示了如何同時啟動多個子項目2024-11-11
Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解
這篇文章主要介紹了Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解,指令重排序是編譯器或處理器為了提高性能而對指令執(zhí)行順序進行重新排列的優(yōu)化技術(shù),需要的朋友可以參考下2024-01-01
java連接數(shù)據(jù)庫知識點總結(jié)以及操作應(yīng)用
這篇文章主要給大家介紹了關(guān)于java連接數(shù)據(jù)庫知識點總結(jié)以及操作應(yīng)用的相關(guān)資料, 當(dāng)涉及到Java中數(shù)據(jù)庫數(shù)據(jù)處理時,我們可以利用強大的Java數(shù)據(jù)庫連接技術(shù)與各種數(shù)據(jù)庫進行交互,需要的朋友可以參考下2023-12-12
定時任務(wù)@Scheduled用法及其參數(shù)使用
這篇文章主要介紹了定時任務(wù)@Scheduled用法及其參數(shù)使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot詳細講解通過自定義classloader加密保護class文件
這篇文章主要介紹了SpringBoot通過自定義classloader加密class文件,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

