您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Java中的常用注解怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java中的常用注解怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
Java 注解用于為 Java 代碼提供元數(shù)據(jù),看完這句話也許你還是一臉懵逼,用人話說(shuō)就是注解不直接影響你的代碼執(zhí)行,僅提供信息。接下我將從注解的定義、元注解、注解屬性、自定義注解、注解解析JDK 提供的注解這幾個(gè)方面再次了解注解(Annotation)
@SuppressWarnings 該注解的作用是阻止編譯器發(fā)出某些警告信息。它可以有以下參數(shù):
deprecation :過(guò)時(shí)的類(lèi)或方法警告?! ? unchecked:執(zhí)行了未檢查的轉(zhuǎn)換時(shí)警告?! ? allthrough:當(dāng)Switch程序塊直接通往下一種情況而沒(méi)有Break時(shí)的警告。 path:在類(lèi)路徑、源文件路徑等中有不存在的路徑時(shí)的警告?! ?nbsp; serial:當(dāng)在可序列化的類(lèi)上缺少serialVersionUID定義時(shí)的警告?!?nbsp; finally:任何finally子句不能完成時(shí)的警告?! ?nbsp; all:關(guān)于以上所有情況的警告
@Deprecated 該注解的作用是標(biāo)記某個(gè)過(guò)時(shí)的類(lèi)或方法。
@Override 該注解用在方法前面,用來(lái)標(biāo)識(shí)該方法是重寫(xiě)父類(lèi)的某個(gè)方法。
元注解主要是用來(lái)注解自定義注解的注解,分別有@Retention、 @Target、 @Document、 @Inherited和@Repeatable(JDK1.8加入)五種。
下面講兩個(gè)平常最常用的注解:
@Retention 注解的生命周期,主要有
RetentionPolicy.SOURCE 僅存在于源碼中 RetentionPolicy.CLASS 默認(rèn)的策略,在class字節(jié)碼文件中存在,但運(yùn)行時(shí)無(wú)法獲得 RetentionPolicy.RUNTIME 在運(yùn)行時(shí)可以通過(guò)反射獲取到,也是最常用的。
@Target 注解的作用目標(biāo),主要有
ElementType.TYPE 作用接口、類(lèi)、枚舉、注解 ElementType.FIELD 作用屬性字段、枚舉的常量 ElementType.METHOD 作用方法 ElementType.PARAMETER 作用方法參數(shù) ElementType.CONSTRUCTOR 作用構(gòu)造函數(shù) ElementType.LOCAL_VARIABLE 作用局部變量 ElementType.ANNOTATION_TYPE 作用于注解(@Retention注解中就使用該屬性) ElementType.PACKAGE 作用于包 ElementType.TYPE_PARAMETER 作用于類(lèi)型泛型,即泛型方法、泛型類(lèi)、泛型接口 (jdk1.8加入)
在枚舉中編譯器只會(huì)限制枚舉的名字不能重復(fù),在開(kāi)發(fā)中經(jīng)常會(huì)遇到枚舉Id 重復(fù)的問(wèn)題,因?yàn)槊總€(gè)人在開(kāi)發(fā)功能的時(shí)候一般只會(huì)專注于自己的功能,做完只會(huì)直接提交代碼,不會(huì)注意到枚舉Id沖突,這個(gè)時(shí)候可以使用下面的代碼進(jìn)行枚舉自檢,在項(xiàng)目的開(kāi)發(fā)階段就能及時(shí)發(fā)現(xiàn)代碼的問(wèn)題。下面的代碼稍微修改下就可以在項(xiàng)目中使用,拿走不寫(xiě)。
1、自定義注解
檢測(cè)枚舉的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、在對(duì)應(yīng)的方法上增加注解
package org.pdool.anno;
/**
* 資源枚舉類(lèi)
* @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)目啟動(dòng)的時(shí)候檢查注解的枚舉
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<>();
// 遍歷每個(gè)枚舉的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);
}
}
}
}
注:上面的代碼只是簡(jiǎn)單的實(shí)例,只是為了展示核心代碼,在項(xiàng)目中使用時(shí)可以修改類(lèi)的獲取為掃描項(xiàng)目下的包,遍歷所有的枚舉,就可以在項(xiàng)目中使用了。
讀到這里,這篇“Java中的常用注解怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。