溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解Java注解編程

發(fā)布時(shí)間:2021-10-18 14:41:45 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“如何理解Java注解編程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何理解Java注解編程”吧!

注解是什么

實(shí)現(xiàn)格式

從代碼來看我們知道注解的實(shí)現(xiàn)格式是:

public @interface MyAnnotation{     屬性列表; }

所以我們有了第一直覺,注解可能是一個(gè)接口。通過查詢資料得知(可以通過反編譯軟件),實(shí)際上 @interface 是自定義接口對(duì) annotation  接口的繼承,@interface 實(shí)際是一個(gè)語法糖。

import java.lang.annotation.Annotation; public interface MyAnnotation extends Annotation{     屬性列表; }

使用位置

類、方法、成員變量、形參位置。

分類

不同角度,我們對(duì)注解能有不同的分類,但知道了注解的實(shí)現(xiàn)原理后就會(huì)明白,實(shí)際上用法和實(shí)現(xiàn)方法都是一回事。

來源

1. JDK注解:一般都是在編譯時(shí)起用作的注解,比如我們最為熟悉的 @Override。

2. 第三方框架注解

3. 自定義注解

運(yùn)行機(jī)制(保留策略)

@Retention({保留策略})     public @interface MyAnnotation{         屬性列表;     }

1.源碼(SOURCE)注解:注解只在源碼中存在,編譯成.class文件就不存在了,也就是說只能起到 “看” 的作用。

2.編譯(CLASS)注解:注解在源碼和.class文件中都存在(JDK自帶注解都屬于編譯時(shí)注解),一般用來作語法校驗(yàn)。

3.運(yùn)行(RUNTIME)注解:在運(yùn)行階段還起作用,甚至?xí)绊戇\(yùn)行邏輯的注解(@Autowired屬于運(yùn)行時(shí)注解),第三方框架和自定注解一般采用  runtime 的保留策略,能實(shí)現(xiàn)依賴注入、切面編程等功能。

元注解

實(shí)際在上面,我們已經(jīng)看到一個(gè)元注解了(@Retention)。元注解就是加在注解上描述注解的注解。 一共有5個(gè)。

1. @Documented

在生成javadoc的時(shí)候就會(huì)把@Documented注解給顯示出來。

2. @Target(關(guān)鍵)

限定作用位置,Method、Class等等。

9. @Inherited

被 @Inherited 注解的注解修飾了一個(gè)父類,如果他的子類沒有被其他注解修飾,則它的子類也繼承了父類的注解。

10. @Retention(關(guān)鍵)

上文的保留策略注解,影響注解作用。

6. @Repeatable (不重要)

@Repeatable  注解是用于聲明其它類型注解的元注解,來表示這個(gè)聲明的注解是可重復(fù)的。@Repeatable的值是另一個(gè)注解,其可以通過這個(gè)另一個(gè)注解的值來包含這個(gè)可重復(fù)的注解。

如何使用

我們先來了解一下注解粗淺的使用。最簡單的,

使用自定義注解就是分為三步:定義注解、使用注解、讀取注解。

如何理解Java注解編程

摘自:https://www.zhihu.com/question/47449512/answer/658228092

我們只要牢牢地把握住這三步,就能掌握注解的使用。

定義注解

因?yàn)?,注解的基本作用是根?jù)注解中的值,判斷該如何執(zhí)行被注解代碼塊。所以,在定義注解時(shí),除了要根據(jù)功能加元注解外,還要根據(jù)業(yè)務(wù)意義,編寫合適的方法名稱。

比如,如果我們要編寫一個(gè)鎖注解:

@Documented @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface Lock {     //輸鎖名稱     String lockName();     //被鎖值     String key();     //鎖級(jí)別     int level();     //異常     String exception() default ""; }

在一個(gè)注解中,能夠返回的類型有:基本數(shù)據(jù)類型、String、enum、Class、其他注解以及前幾者的一維數(shù)組。

注意: 如果沒有 default,那么使用時(shí)就必須要入?yún)ⅰ?/p>

使用注解

注解在該注解的地方,入?yún)⒈厝雲(yún)⒌膮?shù)。

Tips:如果注解中只有一個(gè)函數(shù),雖然使用時(shí)候不需要加函數(shù)名稱就可以直接入?yún)ⅲ珎€(gè)人建議對(duì)于自定義注解,在入?yún)r(shí),還是將函數(shù)名稱寫全,增強(qiáng)代碼可讀性。

讀取注解

我們先想一想,如果是我們自己實(shí)現(xiàn)一個(gè)注解讀取的方法,我們?cè)撛趺磥韺?shí)現(xiàn)呢?

目前我想到的無非就是兩個(gè):

1. 在字符串或字節(jié)碼文件中找注解:這個(gè)判斷可不好寫啊,而且復(fù)雜字符串處理不了。

2. 通過反射獲得類、方法、成員變量上的注解。

明眼人就能看出來 2 比 1 靠譜多了,而且還容易實(shí)現(xiàn)。

最簡單的一種讀取方式:

public static void main(String[] args) throws NoSuchMethodException {      Class<Module> modelClazz = Module.class;      Method method = modelClazz.getMethod("lock", null);      Lock annotationLock = method.getAnnotation(Lock.class);      //獲取注解在 lock 方法上的 value      String lockName = annotationLock.lockName();  }

這也是框架注解的基本實(shí)現(xiàn)原理,因?yàn)橐@取注解的具體代碼塊,所以一般需要掃描包。

對(duì)于切面編程,引入依賴 aspectj 后,那我們就有了更簡單的調(diào)用方法:

//切面代碼節(jié)選    public Object around(ProceedingJoinPoint pjp) throws Throwable {        MethodSignature signature = (MethodSignature) pjp.getSignature();        Lock lock = signature.getMethod().getAnnotation(Lock.class);        lock.lockName();    }

具體關(guān)于切面編程與 joinpoint 的知識(shí),可以參考:

https://blog.csdn.net/qq_15037231/article/details/80624064

注解的作用

至此我們可以總結(jié)出注解的作用。

* 編程提示

保留策略為源碼的注解,一般為提示性注解,比如 @deprecated。

* 用于切面,減少重復(fù)代碼

保留策略為運(yùn)行的注解,0入侵改變函數(shù)的運(yùn)行效果,一般用于重復(fù)性功能,比如日志輸出、數(shù)據(jù)格式校驗(yàn)等。

* 簡化配置信息,項(xiàng)目結(jié)構(gòu)

主要是對(duì)于 springboot 這個(gè)框架的作用。因?yàn)樽⒔饪梢匀≈?,所以在設(shè)置默認(rèn)配置信息的同時(shí),也支持輸入配置信息。

* 格式校驗(yàn)

一般為代碼的語法檢驗(yàn),存在與 jdk 的注解包中,比如 @Override。

到此,相信大家對(duì)“如何理解Java注解編程”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI