Java中使用注解的實(shí)例詳解
注解(Annotation)是放在Java源碼的類、方法、字段、參數(shù)前的一種特殊“注釋”
注釋會(huì)被編譯器直接忽略,注解則可以被編譯器打包進(jìn)入class文件,因此,注解是一種用作標(biāo)注的“元數(shù)據(jù)”。
注解的作用
注解可以分為三類:
1、內(nèi)置注解(由編譯器使用的注解),如:
@Override:讓編譯器檢查該方法是否正確地實(shí)現(xiàn)了覆寫;@SuppressWarnings:告訴編譯器忽略此處代碼產(chǎn)生的警告。
這類注解不會(huì)被編譯進(jìn)入.class文件,它們?cè)诰幾g后就被編譯器扔掉了。
2、由工具處理.class文件使用的注解,比如有些工具會(huì)在加載class的時(shí)候,對(duì)class做動(dòng)態(tài)修改,實(shí)現(xiàn)一些特殊的功能。這類注解會(huì)被編譯進(jìn)入.class文件,但加載結(jié)束后并不會(huì)存在于內(nèi)存中。這類注解只被一些底層庫使用,一般我們不必自己處理。
3、在程序運(yùn)行期能夠讀取的注解,它們?cè)诩虞d后一直存在于JVM中,這也是最常用的注解。例如,一個(gè)配置了@PostConstruct的方法會(huì)在調(diào)用構(gòu)造方法后自動(dòng)被調(diào)用(這是Java代碼讀取該注解實(shí)現(xiàn)的功能,JVM并不會(huì)識(shí)別該注解)。
注解的定義
元注解
有一些注解可以修飾其他注解,這些注解就稱為元注解(meta annotation)。Java標(biāo)準(zhǔn)庫已經(jīng)定義了一些元注解,我們只需要使用元注解,通常不需要自己去編寫元注解。
@Target
定義注解能夠被應(yīng)用于源碼的哪些位置
// 定義注解 @Report 可用在方法上
@Target(ElementType.METHOD)
public @interface MyAnnotation1 {
int type() default 0;
String level() default "info";
String value() default "";
}
// 定義注解 @Report 可用在方法或字段上
@Target({
ElementType.METHOD,
ElementType.FIELD
})
public @interface MyAnnotation2 {
...
}@Retention
定義注解的生命周期,默認(rèn)為 CLASS,使用最多一般是 RUNTIME
- 僅編譯期:
RetentionPolicy.SOURCE - 僅class文件:
RetentionPolicy.CLASS - 運(yùn)行期:
RetentionPolicy.RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
int type() default 0;
String level() default "info";
String value() default "";
}@Repeatable
定義注解是否可重復(fù)
@Repeatable(Reports.class)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
int type() default 0;
String level() default "info";
String value() default "";
}@Inherited
定義子類是否可繼承父類定義的注解
@Inherited
@Target(ElementType.TYPE)
public @interface MyAnnotation {
int type() default 0;
String level() default "info";
String value() default "";
}定義注解
public @interface xxx {...}- 用
@interface定義注解 - 添加參數(shù)、默認(rèn)值
- 用元注解配置注解
// 用元注解配置注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
// 用 @interface 定義注解
public @interface MyAnnotation {
// 注解的參數(shù)
int type() default 0;
String level() default "info";
String value() default "";
}- 定義一個(gè)注解時(shí),還可以定義配置參數(shù)。配置參數(shù)可以包括:基本類型、String、Class、枚舉類型。
- 可以使用 default 來聲明參數(shù)的默認(rèn)值
- 最常用的參數(shù)定義為
value(),推薦所有參數(shù)都盡量設(shè)置默認(rèn)值 - 必須設(shè)置
@Target和@Retention,@Retention一般設(shè)置為RUNTIME,便于運(yùn)行期讀取該注解
到此這篇關(guān)于Java中如何使用注解的文章就介紹到這了,更多相關(guān)java注解使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis使用注解開發(fā)實(shí)現(xiàn)步驟解析
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java壓縮解壓zip技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java解壓縮zip - 多個(gè)文件(包括文件夾),對(duì)多個(gè)文件和文件夾進(jìn)行壓縮,對(duì)復(fù)雜的文件目錄進(jìn)行解壓。壓縮方法使用的是可變參數(shù),可以壓縮1到多個(gè)文件2017-05-05
SpringBoot的條件裝配原理及實(shí)現(xiàn)思路
SpringBoot的條件裝配是基于@Conditional注解實(shí)現(xiàn)的,下面我們使用原生的@Conditional注解模擬實(shí)現(xiàn)類的條件裝配,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-08-08
MyBatis-Plus?updateById更新不了空字符串或null的解決方法
本文主要介紹了MyBatis-Plus?updateById更新不了空字符串或null的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄
這篇文章主要介紹了Mybatis配置文件之動(dòng)態(tài)SQL配置備忘錄的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java實(shí)現(xiàn)文件名倒序排序的技術(shù)指南
在實(shí)際開發(fā)過程中,我們經(jīng)常需要對(duì)文件進(jìn)行操作和處理,一個(gè)常見的需求是按文件名倒序排列文件列表,以便于文件的管理和查找,本文將介紹如何在Java中實(shí)現(xiàn)文件名倒序排序,并提供詳細(xì)的代碼案例,需要的朋友可以參考下2024-08-08
IDEA項(xiàng)目maven?project沒有出現(xiàn)plugins和Dependencies問題
這篇文章主要介紹了IDEA項(xiàng)目maven?project沒有出現(xiàn)plugins和Dependencies問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java常用鎖synchronized和ReentrantLock的區(qū)別
這篇文章主要介紹了Java常用鎖synchronized和ReentrantLock的區(qū)別,二者的功效都是相同的,但又有很多不同點(diǎn),下面我們就進(jìn)入文章了解具體的相關(guān)內(nèi)容吧。需要的小伙伴也可以參考一下2022-05-05

