JAVA中註解的簡單使用

Java SE5內置了三種標準註解:

     @Override,表示當前的方法定義將覆蓋超類中的方法。

     @Deprecated,使用了註解爲它的元素編譯器將發出警告,因爲註解@Deprecated是不贊成使用的代碼,被棄用的代碼。

     @SuppressWarnings,關閉不當編譯器警告信息。


Java還提供了4中註解,專門負責新註解的創建。

 

@Target

表示該註解可以用於什麼地方,可能的ElementType參數有:

CONSTRUCTOR:構造器的聲明

FIELD:域聲明(包括enum實例)

LOCAL_VARIABLE:局部變量聲明

METHOD:方法聲明

PACKAGE:包聲明

PARAMETER:參數聲明

TYPE:類、接口(包括註解類型)或enum聲明

@Retention

表示需要在什麼級別保存該註解信息。可選的RetentionPolicy參數包括:

SOURCE:註解將被編譯器丟棄

CLASS:註解在class文件中可用,但會被VM丟棄

RUNTIME:VM將在運行期間保留註解,因此可以通過反射機制讀取註解的信息。

@Document

將註解包含在Javadoc中

@Inherited

允許子類繼承父類中的註解


定義一個test註解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {

}

除了@符號,註解很像是一個接口。定義註解的時候需要用到元註解,上面用到了@Target@RetentionPolicy

在註解中一般會有一些元素以表示某些值。註解的元素看起來就像接口的方法,唯一的區別在於可以爲其制定默認值。沒有元素的註解稱爲標記註解,上面的@Test就是一個標記註解。 

    註解的可用的類型包括以下幾種:所有基本類型、String、Class、enum、Annotation、以上類型的數組形式。元素不能有不確定的值,即要麼有默認值,要麼在使用註解的時候提供元素的值。而且元素不能使用null作爲默認值。註解在只有一個元素且該元素的名稱是value的情況下,在使用註解的時候可以省略“value=”,直接寫需要的值即可。 

下面看一個定義了元素的註解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
 public @interface UseCase {
     public String id();
     public String description() default "no description";
}

再定義一個JAVA類去使用它:

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



發佈了13 篇原創文章 · 獲贊 13 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章