溫馨提示×

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

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

Java中的常用注解怎么使用

發(fā)布時(shí)間:2022-02-28 10:25:40 來(lái)源:億速云 閱讀:133 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“Java中的常用注解怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Java中的常用注解怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    一、注解是什么

    Java 注解用于為 Java 代碼提供元數(shù)據(jù),看完這句話也許你還是一臉懵逼,用人話說(shuō)就是注解不直接影響你的代碼執(zhí)行,僅提供信息。接下我將從注解的定義、元注解、注解屬性、自定義注解、注解解析JDK 提供的注解這幾個(gè)方面再次了解注解(Annotation)

    二、jdk支持的注解有哪些

    2.1 三種常用的注解:

    @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è)方法。

    2.2 元注解

    元注解主要是用來(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加入)

    三、注解實(shí)例

    在枚舉中編譯器只會(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è)資訊頻道。

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

    免責(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)容。

    AI