2011年11月15日 星期二

java 注解程式範例



    注解的語法比較簡單,除了@符號的使用以外,它基本上與java的固有語法一致,java內置了三種注解,定義在java.lang包中。
      @Override  表示當前方法是覆蓋父類的方法。
      @Deprecated  表示當前元素是不贊成使用的。
      @SuppressWarnings 表示關閉一些不當的編譯器警告資訊。


  下面是一個定義注解的實例
1.     package Test_annotation;  
2.       
3.     import java.lang.annotation.Documented;  
4.     import java.lang.annotation.Inherited;  
5.     import java.lang.annotation.Retention;  
6.     import java.lang.annotation.Target;  
7.     import java.lang.annotation.ElementType;  
8.     import java.lang.annotation.RetentionPolicy;  
9.       
10.  /* 
11.   * 元注解@Target,@Retention,@Documented,@Inherited 
12.   *  
13.   *     @Target 表示該注解用於什麼地方,可能的 ElemenetType 參數包括: 
14.   *         ElemenetType.CONSTRUCTOR 構造器聲明 
15.   *         ElemenetType.FIELD 域聲明(包括 enum 實例) 
16.   *         ElemenetType.LOCAL_VARIABLE 區域變數聲明 
17.   *         ElemenetType.METHOD 方法聲明 
18.   *         ElemenetType.PACKAGE 包聲明 
19.   *         ElemenetType.PARAMETER 參數聲明 
20.   *         ElemenetType.TYPE 類,介面(包括注解類型)或enum聲明 
21.   *          
22.   *     @Retention 表示在什麼級別保存該注解資訊。可選的 RetentionPolicy 參數包括: 
23.   *         RetentionPolicy.SOURCE 注解將被編譯器丟棄 
24.   *         RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄 
25.   *         RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的資訊。 
26.   *          
27.   *     @Documented 將此注解包含在 javadoc  
28.   *      
29.   *     @Inherited 允許子類繼承父類中的注解 
30.   *    
31.   */  
32.  @Target(ElementType.METHOD)  
33.  @Retention(RetentionPolicy.RUNTIME)  
34.  @Documented  
35.  @Inherited  
36.  /* 
37.   * 定義注解 Test 
38.   * 注解中含有兩個元素 id  description 
39.   * description 元素 有預設值 "no description" 
40.   */  
41.  public @interface Test {  
42.      public int id();  
43.      public String description() default "no description";  
44.  }  
下面是一個使用注解  解析注解的實例
1.     package Test_annotation;  
2.       
3.     import java.lang.reflect.Method;  
4.       
5.     public class Test_1 {  
6.         /* 
7.          * 被注解的三個方法 
8.          */  
9.         @Test(id = 1, description = "hello method_1")  
10.      public void method_1() {  
11.      }  
12.    
13.      @Test(id = 2)  
14.      public void method_2() {  
15.      }  
16.    
17.      @Test(id = 3, description = "last method")  
18.      public void method_3() {  
19.      }  
20.    
21.      /* 
22.       * 解析注解,將Test_1 所有被注解方法 的資訊列印出來 
23.       */  
24.      public static void main(String[] args) {  
25.          Method[] methods = Test_1.class.getDeclaredMethods();  
26.          for (Method method : methods) {  
27.              /* 
28.               * 判斷方法中是否有指定注解類型的注解 
29.               */  
30.              boolean hasAnnotation = method.isAnnotationPresent(Test.class);  
31.              if (hasAnnotation) {  
32.                  /* 
33.                   * 根據注解類型返回方法的指定類型注解 
34.                   */  
35.                  Test annotation = method.getAnnotation(Test.class);  
36.                  System.out.println("Test( method = " + method.getName()  
37.                          + " , id = " + annotation.id() + " , description = "  
38.                          + annotation.description() + " )");  
39.              }  
40.          }  
41.      }  
42.    
43.  }  
輸出結果如下:

    Test( method = method_1 , id = 1 , description = hello method_1 )
    Test( method = method_2 , id = 2 , description = no description )
    Test( method = method_3 , id = 3 , description = last method )

沒有留言: