Java注解

Java注解

Spring中用到了Java注解,可Java注解究竟是怎么一回事呢?

什么是注解

注解用一個詞來描述就是元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。比如我們經常使用@Override注解來標注被重寫的方法,可是,即使我們不使用注解標注,程序也可以正確執(zhí)行呀,那為什么還要注解呢。
事實上,@Override告訴編譯器這個方法是一個重寫方法(描述方法的元數(shù)據(jù)),如果父類中不存在該方法,編譯器便會報錯,提示該方法沒有重寫父類中的方法。如果我不小心拼寫錯誤,例如將toString()寫成了toStrring(){double r},而且我也沒有使用@Override注解,那程序依然能編譯運行。但運行結果會和我期望的大不相同?,F(xiàn)在我們了解了什么是注解,并且使用注解有助于閱讀程序。
在項目配置方面,注解會于代碼相連。假如你想為應用設置很多的常量或參數(shù),這種情況下,XML是一個很好的選擇,因為它不會同特定的代碼相連。如果你想把某個方法聲明為服務,那么使用Annotation會更好一些,因為這種情況下需要注解和方法緊密耦合起來,開發(fā)人員也必須認識到這點。

Java SE5內置的三種標準注解

@Override重寫
@Deprecated為它的元素編譯發(fā)出警告,表示這是不贊成使用,被棄用的代碼
@SuppressWarning關閉不當編譯警告信息

創(chuàng)建新注解

Java提供了4種注解,負責創(chuàng)建新注解

  • @Documented 將注解包含在JavaDoc中
  • @Retention 表示需要在什么級別保存該注解信息。可選的RetentionPolicy參數(shù)包括:
    SOURCE:注解將被編譯器丟棄
    CLASS:注解在class文件中可用,但會被VM丟棄
    RUNTIME:VM將在運行期間保留注解,因此可以通過反射機制讀取注解的信息。
  • @Target 注解用于什么地方
    可能的ElementType參數(shù)有:
    CONSTRUCTOR:構造器的聲明
    FIELD:域聲明(包括enum實例)
    LOCAL_VARIABLE:局部變量聲明
    METHOD:方法聲明
    PACKAGE:包聲明
    PARAMETER:參數(shù)聲明
    TYPE:類、接口(包括注解類型)或enum聲明
  • @Inherited 允許子類繼承該注解

Example

  • 定義一個注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
      public String id();
      public String description() default "no description";
 }

在注解中一般會有一些元素以表示某些值。注解的元素看起來就像接口的方法,唯一的區(qū)別在于可以為其制定默認值。沒有元素的注解稱為標記注解
注解的可用的類型包括以下幾種:所有基本類型、String、Class、enum、Annotation、以上類型的數(shù)組形式。元素不能有不確定的值,即要么有默認值,要么在使用注解的時候提供元素的值。而且元素不能使用null作為默認值。注解在只有一個元素且該元素的名稱是value的情況下,在使用注解的時候可以省略“value=”,直接寫需要的值即可。

  • 使用注解
public class PasswordUtils {
     @UseCase(id = 47, description = "Passwords must contain at least one numeric")
     public boolean validatePassword(String password) {
         return (password.matches("\\w*\\d\\w*"));
     }
 
     @UseCase(id = 48)
     public String encryptPassword(String password) {
         return new StringBuilder(password).reverse().toString();
     }
 }
  • 對注解進行處理
public static void main(String[] args) {
     List<Integer> useCases = new ArrayList<Integer>();
     Collections.addAll(useCases, 47, 48, 49, 50);
     trackUseCases(useCases, PasswordUtils.class);
 }
 public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
     for (Method m : cl.getDeclaredMethods()) {
         UseCase uc = m.getAnnotation(UseCase.class);
         if (uc != null) {
             System.out.println("Found Use Case:" + uc.id() + " "
                         + uc.description());
             useCases.remove(new Integer(uc.id()));
         }
     }
     for (int i : useCases) {
         System.out.println("Warning: Missing use case-" + i);
     }
 }
 ----------------------------------
運行結果
Found Use Case:47 Passwords must contain at least one numeric
Found Use Case:48 no description
Warning: Missing use case-49
Warning: Missing use case-50

參考文獻

java中注解的使用與實例(一)
Java中的注解是如何工作的?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 內容概要 Annotation的概念 Annotation的作用 Annotation的分類 系統(tǒng)內置注解 元注解...
    DevinZhang閱讀 4,333評論 0 29
  • 注解 創(chuàng)建注解 下面代碼創(chuàng)建了一個名為MyAnno的注解,有兩個成員str和val。@Retention(…)注解...
    kylinxiang閱讀 4,088評論 0 2
  • 同時發(fā)布于 知乎 Java 注解 1.注解的由來 在引入注解之前,在不同類型的應用程序使用XML作為標準的代碼配置...
    踐行者閱讀 1,051評論 0 0
  • 硬筆6張 畫10張 字10張 弟子規(guī)一張 布面一幅 剪紙另算大5小8
    GreatQ閱讀 150評論 0 0

友情鏈接更多精彩內容