1. 程式人生 > >如何使用自定義註解。

如何使用自定義註解。

Java註解目前廣泛被應用。spring中的基於註解的依賴注入、Spring Web MVC中的Route、PlayFramework中的基於註解的Validation等。

使用註解,可以在適當地方替代XML的繁瑣。

現在來看看,如何自定義註解。

目標:通過註解方式,定義屬性的預設值。例如:

  1. publicclass DefaultUse {  
  2.     @Default(value = "Hello Annotation")  
  3.     private String msg;  
  4.     publicvoid say(){  
  5.         System.out.println(msg);  
  6.     }  
  7. }  


一、新建Annotation

  1. import java.lang.annotation.ElementType;  
  2. import java.lang.annotation.Retention;  
  3. import java.lang.annotation.RetentionPolicy;  
  4. import java.lang.annotation.Target;  
  5. /** 
  6.  * @Retention 指定註釋的生存時期 
  7.  * CLASS:註釋記錄在類檔案中,但在執行時 VM 不需要保留註釋。 
  8.  * RUNTIME:註釋記錄在類檔案中,在執行時 VM 將保留註釋,因此可以使用反射機制讀取註釋內容。
     
  9.  * SOURCE:編譯器要丟棄的註釋。 
  10.  */
  11. @Retention(RetentionPolicy.RUNTIME)   
  12. /** 
  13.  * @Target  
  14.  * 指示註釋型別所適用的程式元素的種類,如果註釋型別宣告中不存在 Target 元註釋, 
  15.  * 則宣告的型別可以用在任一程式元素上。 
  16.  * ElementType.ANNOTATION_TYPE:註釋型別宣告 
  17.  * ElementType.CONSTRUCTOR:構造方法宣告 
  18.  * ElementType.FILED:欄位宣告 
  19.  * ElementType.LOCAL_VARIABLE:區域性變數宣告 
  20.  * ElementType.METHOD:方法宣告
     
  21.  * ElementType.PACKAGE:包宣告 
  22.  * ElementType.PARAMETER:引數宣告 
  23.  * ElementType.TYPE:類、藉口或列舉宣告 
  24.  */
  25. @Target(ElementType.FIELD)  
  26. public@interface Default {  
  27.     String value(); //預設值
  28. }  

二、實際類中使用
  1. publicclass DefaultUse {  
  2.     @Default(value = "Hello Annotation")  
  3.     private String msg;  
  4.     publicvoid setMsg(String msg) {  
  5.         this.msg = msg;  
  6.     }  
  7.     publicvoid say(){  
  8.         System.out.println(msg);  
  9.     }  
  10. }  

三、註解解析過程
  1. import java.beans.PropertyDescriptor;  
  2. import java.lang.reflect.Field;  
  3. import java.lang.reflect.Method;  
  4. publicclass DefaultTest {  
  5.     publicstaticvoid main(String args[]) throws Exception{  
  6.         DefaultUse use = new DefaultUse();  
  7.         //Default註解的處理過程
  8.         //這裡使用反射機制完成預設值的設定
  9.         Field[] fileds = use.getClass().getDeclaredFields();  
  10.         for(Field filed : fileds){  
  11.             Default annotation = filed.getAnnotation(Default.class);  
  12.             if(annotation != null){  
  13.                 PropertyDescriptor pd = new PropertyDescriptor(filed.getName(), DefaultUse.class);  
  14.                 Method setterName = pd.getWriteMethod();  
  15.                 if(setterName!=null){  
  16.                     String value = annotation.value();  
  17.                     filed.setAccessible(true);  
  18.                     setterName.invoke(use, value);  
  19.                 }  
  20.             }  
  21.         }  
  22.         use.say();  
  23.     }  
  24. }