新聞中心
前言

公司主營(yíng)業(yè)務(wù):網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出龍游免費(fèi)做網(wǎng)站回饋大家。
今天在看以前寫(xiě)的代碼,發(fā)現(xiàn)自己對(duì)注解的了解還不是非常透徹,經(jīng)常選擇性就忽視了對(duì)注解實(shí)現(xiàn)的探究,遂查詢資料學(xué)習(xí)了一下。
注解是什么
實(shí)現(xiàn)格式
從代碼來(lái)看我們知道注解的實(shí)現(xiàn)格式是:
- public @interface MyAnnotation{
- 屬性列表;
- }
所以我們有了第一直覺(jué),注解可能是一個(gè)接口。通過(guò)查詢資料得知(可以通過(guò)反編譯軟件),實(shí)際上 @interface 是自定義接口對(duì) annotation 接口的繼承,@interface 實(shí)際是一個(gè)語(yǔ)法糖。
- import java.lang.annotation.Annotation;
- public interface MyAnnotation extends Annotation{
- 屬性列表;
- }
使用位置
類(lèi)、方法、成員變量、形參位置。
分類(lèi)
不同角度,我們對(duì)注解能有不同的分類(lèi),但知道了注解的實(shí)現(xiàn)原理后就會(huì)明白,實(shí)際上用法和實(shí)現(xiàn)方法都是一回事。
來(lái)源
1. JDK注解:一般都是在編譯時(shí)起用作的注解,比如我們最為熟悉的 @Override。
2. 第三方框架注解
3. 自定義注解
運(yùn)行機(jī)制(保留策略)
- @Retention({保留策略})
- public @interface MyAnnotation{
- 屬性列表;
- }
1.源碼(SOURCE)注解:注解只在源碼中存在,編譯成.class文件就不存在了,也就是說(shuō)只能起到 “看” 的作用。
2.編譯(CLASS)注解:注解在源碼和.class文件中都存在(JDK自帶注解都屬于編譯時(shí)注解),一般用來(lái)作語(yǔ)法校驗(yàn)。
3.運(yùn)行(RUNTIME)注解:在運(yùn)行階段還起作用,甚至?xí)绊戇\(yùn)行邏輯的注解(@Autowired屬于運(yùn)行時(shí)注解),第三方框架和自定注解一般采用 runtime 的保留策略,能實(shí)現(xiàn)依賴(lài)注入、切面編程等功能。
元注解
實(shí)際在上面,我們已經(jīng)看到一個(gè)元注解了(@Retention)。元注解就是加在注解上描述注解的注解。 一共有5個(gè)。
1. @Documented
在生成javadoc的時(shí)候就會(huì)把@Documented注解給顯示出來(lái)。
2. @Target(關(guān)鍵)
限定作用位置,Method、Class等等。
9. @Inherited
被 @Inherited 注解的注解修飾了一個(gè)父類(lèi),如果他的子類(lèi)沒(méi)有被其他注解修飾,則它的子類(lèi)也繼承了父類(lèi)的注解。
10. @Retention(關(guān)鍵)
上文的保留策略注解,影響注解作用。
6. @Repeatable (不重要)
@Repeatable 注解是用于聲明其它類(lèi)型注解的元注解,來(lái)表示這個(gè)聲明的注解是可重復(fù)的。@Repeatable的值是另一個(gè)注解,其可以通過(guò)這個(gè)另一個(gè)注解的值來(lái)包含這個(gè)可重復(fù)的注解。
如何使用
我們先來(lái)了解一下注解粗淺的使用。最簡(jiǎn)單的,
使用自定義注解就是分為三步:定義注解、使用注解、讀取注解。
摘自:https://www.zhihu.com/question/47449512/answer/658228092
我們只要牢牢地把握住這三步,就能掌握注解的使用。
定義注解
因?yàn)?,注解的基本作用是根?jù)注解中的值,判斷該如何執(zhí)行被注解代碼塊。所以,在定義注解時(shí),除了要根據(jù)功能加元注解外,還要根據(jù)業(yè)務(wù)意義,編寫(xiě)合適的方法名稱(chēng)。
比如,如果我們要編寫(xiě)一個(gè)鎖注解:
- @Documented
- @Retention(RUNTIME)
- @Target({TYPE, METHOD})
- public @interface Lock {
- //輸鎖名稱(chēng)
- String lockName();
- //被鎖值
- String key();
- //鎖級(jí)別
- int level();
- //異常
- String exception() default "";
- }
在一個(gè)注解中,能夠返回的類(lèi)型有:基本數(shù)據(jù)類(lèi)型、String、enum、Class、其他注解以及前幾者的一維數(shù)組。
注意: 如果沒(méi)有 default,那么使用時(shí)就必須要入?yún)ⅰ?/p>
使用注解
注解在該注解的地方,入?yún)⒈厝雲(yún)⒌膮?shù)。
Tips:如果注解中只有一個(gè)函數(shù),雖然使用時(shí)候不需要加函數(shù)名稱(chēng)就可以直接入?yún)ⅲ珎€(gè)人建議對(duì)于自定義注解,在入?yún)r(shí),還是將函數(shù)名稱(chēng)寫(xiě)全,增強(qiáng)代碼可讀性。
讀取注解
我們先想一想,如果是我們自己實(shí)現(xiàn)一個(gè)注解讀取的方法,我們?cè)撛趺磥?lái)實(shí)現(xiàn)呢?
目前我想到的無(wú)非就是兩個(gè):
1. 在字符串或字節(jié)碼文件中找注解:這個(gè)判斷可不好寫(xiě)啊,而且復(fù)雜字符串處理不了。
2. 通過(guò)反射獲得類(lèi)、方法、成員變量上的注解。
明眼人就能看出來(lái) 2 比 1 靠譜多了,而且還容易實(shí)現(xiàn)。
最簡(jiǎn)單的一種讀取方式:
- public static void main(String[] args) throws NoSuchMethodException {
- Class
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ì)于切面編程,引入依賴(lài) aspectj 后,那我們就有了更簡(jiǎn)單的調(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)等。
* 簡(jiǎn)化配置信息,項(xiàng)目結(jié)構(gòu)
主要是對(duì)于 springboot 這個(gè)框架的作用。因?yàn)樽⒔饪梢匀≈?,所以在設(shè)置默認(rèn)配置信息的同時(shí),也支持輸入配置信息。
* 格式校驗(yàn)
一般為代碼的語(yǔ)法檢驗(yàn),存在與 jdk 的注解包中,比如 @Override。
當(dāng)前文章:關(guān)于Java注解(annotation)編程
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/dpeijhh.html


咨詢
建站咨詢
