一篇文章帶你搞定JAVA注解
1、注解是什么
Java 注解用于為 Java 代碼提供元數(shù)據(jù),看完這句話也許你還是一臉懵逼,用人話說就是注解不直接影響你的代碼執(zhí)行,僅提供信息。接下我將從注解的定義、元注解、注解屬性、自定義注解、注解解析JDK 提供的注解這幾個方面再次了解注解(Annotation)
2、jdk支持的注解有哪些
2.1 三種常用的注解:
@SuppressWarnings 注解的作用是阻止編譯器發(fā)出某些警告信息。它可以有以下參數(shù):
deprecation :過時的類或方法警告。
unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時警告?! ?/p>
allthrough:當(dāng)Switch程序塊直接通往下一種情況而沒有Break時的警告。
path:在類路徑、源文件路徑等中有不存在的路徑時的警告。
serial:當(dāng)在可序列化的類上缺少serialVersionUID定義時的警告?!?/p>
finally:任何finally子句不能完成時的警告?! ?/p>
all:關(guān)于以上所有情況的警告
@Deprecated 該注解的作用是標(biāo)記某個過時的類或方法。
@Override 該注解用在方法前面,用來標(biāo)識該方法是重寫父類的某個方法。
2.2 元注解
元注解主要是用來注解自定義注解的注解,分別有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五種。
下面講兩個平常最常用的注解:
@Retention 注解的生命周期,主要有
RetentionPolicy.SOURCE 僅存在于源碼中
RetentionPolicy.CLASS 默認(rèn)的策略,在class字節(jié)碼文件中存在,但運(yùn)行時無法獲得 RetentionPolicy.RUNTIME 在運(yùn)行時可以通過反射獲取到,也是最常用的。
@Target 注解的作用目標(biāo),主要有
ElementType.TYPE 作用接口、類、枚舉、注解
ElementType.FIELD 作用屬性字段、枚舉的常量
ElementType.METHOD 作用方法
ElementType.PARAMETER 作用方法參數(shù)
ElementType.CONSTRUCTOR 作用構(gòu)造函數(shù)
ElementType.LOCAL_VARIABLE 作用局部變量
ElementType.ANNOTATION_TYPE 作用于注解(@Retention注解中就使用該屬性) ElementType.PACKAGE 作用于包 ElementType.TYPE_PARAMETER 作用于類型泛型,即泛型方法、泛型類、泛型接口 (jdk1.8加入)
3、注解實(shí)例
在枚舉中編譯器只會限制枚舉的名字不能重復(fù),在開發(fā)中經(jīng)常會遇到枚舉Id 重復(fù)的問題,因?yàn)槊總€人在開發(fā)功能的時候一般只會專注于自己的功能,做完只會直接提交代碼,不會注意到枚舉Id沖突,這個時候可以使用下面的代碼進(jìn)行枚舉自檢,在項(xiàng)目的開發(fā)階段就能及時發(fā)現(xiàn)代碼的問題。下面的代碼稍微修改下就可以在項(xiàng)目中使用,拿走不寫。
1、自定義注解
檢測枚舉的key 是否有重復(fù)
package org.pdool.anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @author 香菜 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CheckEnum { }
2、在對應(yīng)的方法上增加注解
package org.pdool.anno; /** * 資源枚舉類 * @author 香菜 */ public enum ResType { GOLD(1), DIAMOND(2), //注意:此處重復(fù) SILVER(2); int type; @CheckEnum public int getType() { return type; } ResType(int type) { this.type = type; } }
3、在項(xiàng)目啟動的時候檢查注解的枚舉
package org.pdool.anno; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; /** * @author 香菜 */ public class Aain { public static void main(String[] args) throws InvocationTargetException,IllegalAccessException { // 獲取有注解的方法 Method[] declaredMethods = ResType.class.getDeclaredMethods(); Method annoMethod = null; for (Method declaredMethod : declaredMethods) { CheckEnum annotation = declaredMethod.getAnnotation(CheckEnum.class); if (annotation != null){ annoMethod = declaredMethod; break; } } Set<Object> set = new HashSet<>(); // 遍歷每個枚舉的id Object[] oo = ResType.class.getEnumConstants(); for (Object o : oo) { Object invoke = annoMethod.invoke(o); if (!set.contains(invoke)){ set.add(invoke); }else { System.out.println("重復(fù)的key "+ o +" -- "+ invoke); } } } }
注:上面的代碼只是簡單的實(shí)例,只是為了展示核心代碼,在項(xiàng)目中使用時可以修改類的獲取為掃描項(xiàng)目下的包,遍歷所有的枚舉,就可以在項(xiàng)目中使用了。
4、總結(jié)
注解雖然不影響代碼的運(yùn)行,但是可以為運(yùn)行中的程序提供更多的信息,注解也是很多框架的基本技術(shù)切入點(diǎn),比如Spring 的注解,Lombok 的各種注解,都是使用了注解做了很多事,明白了注解是怎么回事,理解框架也會輕而易舉。
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究
這篇文章主要為大家介紹了Java中的ReadWriteLock高效處理并發(fā)讀寫操作實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Java?代碼本地設(shè)置Hadoop用戶名密碼的方法
在Hadoop環(huán)境中,通常使用Kerberos進(jìn)行身份驗(yàn)證,這篇文章主要介紹了Java?代碼本地設(shè)置Hadoop用戶名密碼的方法,需要的朋友可以參考下2024-08-08第三方網(wǎng)站微信登錄java代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了第三方網(wǎng)站微信登錄的java代碼實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Java手動實(shí)現(xiàn)Redis的LRU緩存機(jī)制
在Java中LRU的實(shí)現(xiàn)方式是使用HashMap結(jié)合雙向鏈表,HashMap的值是雙向鏈表的節(jié)點(diǎn),雙向鏈表的節(jié)點(diǎn)也保存一份key value。2021-05-05java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和
這篇文章主要給大家介紹了關(guān)于java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點(diǎn),是對容器對象功能的增強(qiáng),它專注于對容器對象進(jìn)行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下2023-12-12