天天看點

Java注解

     注解目前非常的流行,很多主流架構都支援注解,而且自己編寫代碼的時候也會盡量的去用注解,一時友善,而是代碼更加簡潔。

     注解的文法比較簡單,除了@符号的使用之外,它基本與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 允許子類繼承父類中的注解

     定義一個注解的方式: 

1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 public @interface Test {
4 
5 }      

     除了@符号,注解很像是一個接口。定義注解的時候需要用到元注解,上面用到了@Target和@RetentionPolicy,它們的含義在上面的表格中已近給出。 

     在注解中一般會有一些元素以表示某些值。注解的元素看起來就像接口的方法,唯一的差別在于可以為其制定預設值。沒有元素的注解稱為标記注解,上面的@Test就是一個标記注解。 

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

     下面看一個定義了元素的注解。 

1 @Target(ElementType.METHOD)
2 @Retention(RetentionPolicy.RUNTIME)
3 public @interface UseCase {
4     public String id();
5     public String description() default "no description";
6 }      

     定義了注解,必然要去使用注解。 

1 public class PasswordUtils {
 2     @UseCase(id = 47, description = "Passwords must contain at least one numeric")
 3     public boolean validatePassword(String password) {
 4         return (password.matches("\\w*\\d\\w*"));
 5     }
 6 
 7     @UseCase(id = 48)
 8     public String encryptPassword(String password) {
 9         return new StringBuilder(password).reverse().toString();
10     }
11 }      

     使用注解最主要的部分在于對注解的處理,那麼就會涉及到注解處理器。

     從原理上講,注解處理器就是通過反射機制擷取被檢查方法上的注解資訊,然後根據注解元素的值進行特定的處理。 

1 public static void main(String[] args) {
 2     List<Integer> useCases = new ArrayList<Integer>();
 3     Collections.addAll(useCases, 47, 48, 49, 50);
 4     trackUseCases(useCases, PasswordUtils.class);
 5 }
 6 
 7 public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
 8     for (Method m : cl.getDeclaredMethods()) {
 9         UseCase uc = m.getAnnotation(UseCase.class);
10         if (uc != null) {
11             System.out.println("Found Use Case:" + uc.id() + " "
12                         + uc.description());
13             useCases.remove(new Integer(uc.id()));
14         }
15     }
16     for (int i : useCases) {
17         System.out.println("Warning: Missing use case-" + i);
18     }
19 }      

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

     上面的三段代碼結合起來是一個跟蹤項目中用例的簡單例子。

     寫到這裡部落客想到結合枚舉、注解、反射、攔截器等内容,是否可以寫一套使用者權限驗證呢?

     将使用者權限用枚舉的方式給出,注解元素表明某個方法必須擁有某些權限才能調用,攔截器攔截請求方法,使用者是否有權限對該方法進行調用,根據使用者不同的權限進行不同的處理。歡迎讨論!

如果本文對您有幫助,點一下右下角的“推薦”