J2SE 5.0新的特性——Annotation(註釋)

1、自定義註釋   
一、自定義Annotation的格式
    [public] @interface Annotation名稱{
        數據類型  變量名稱 ();
    }
  提示:使用@interface就至關於繼承了Annotation接口。
  示例一:在Annotation中設置多個屬性
  public @interface AnnotationWithParam {
    public String key();
    public String value();
  }
  示例二:在Annotation中設置數組屬性
  public @interface AnnotationWithArrayParam {
      public String[] value(); // 接收設置的內容是一個字符串數組
  }
  
二、Annotation定義變量的默認值
   [public] @interface Annotation名稱{
     數據類型 變量名稱 () default 默認值;
   }
  example:
   public @interface AnnotationWithParam {
      public String key() defalut "zhangsan";
      public String value() defalut "張三";
  }
  
三、使用枚舉限制設置的內容
 /***定義枚舉類***************/
  public enum Name {
    ZSM,LX,LIU
 }
 /*****自定義Annotation類****/
  public @interface AnnotationEnum {
   public Name name() default Name.ZSM;
  }
提示:這樣定義的Annotation,在使用AnnotationEnum時,全部的取值就必須從Name這個枚舉中取得。


2、相關內建註釋知識介紹
  1) @Retention:用於定義一個Annotation的保存範圍。在Retention定義中存在一個RetentionPolicy的變量,此變量用於指定Annotation的保存範圍。RetentionPolicy包含以下3個範圍:
    (1) SOURCE: 此Annotation類型的信息只會保留在程序源文件中(*.java),編譯以後不會保存在編譯好的類文件(*.class)中;
    (2) CLASS: 默認範圍。此Annotation類型的信息只會保留在程序源文件中(*.java)和編譯以後 的 類文件(*.class)中。在使用此類時,這些Annotation信息將不會被夾在到虛擬機(JVM)中;
    (3) runtime: 此Annotation類型的信息保留在源文件(*.java)、類文件(*.class)中,在執行時也會加載到JVM中。
      
  2) @Target: 用於指定註釋出現的位置(類、方法或屬性)。在Target定義存在ElememtType[]枚舉類型的變量,這個變量主要指定Annotation的使用限制。 
   public enum ElementType {
    TYPE,          // 只能用在類、接口、枚舉類型上
    FIELD,
    METHOD,
    PARAMETER,     // 只能用在參數的聲明上
    CONSTRUCTOR,   // 只能用在構造器的聲明上
    LOCAL_VARIABLE,// 只能用在局部變量的聲明上
    ANNOTATION_TYPE,// 只能用在註釋的聲明上
    PACKAGE
  }
  
  3) @Inherit:用於標註一個父類的註釋是否能夠被之類所繼承,若是一個Annotation須要被其之類所繼承,則在聲明時直接使用@Inherit註釋便可。
   
3、經過反射取得Annotation
    若是想讓一個Annotation其做用,則必須結合反射機制。Class類中存在如下幾種與Annotation操做有關的方法:
       public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
           若是在一個元素中存在註釋,則取得所有註釋
       public Annotation[] getAnnotations()
           返回此元素上的全部註釋
       public Annotation[] getDeclaredAnnotations()
           返回直接存放在此元素上的全部註釋
       public boolean isAnnotation()
           判斷元素是否表示一個註釋
       public boolean isAnnotionPresent(Class<? extends Annotation> annotationClass)
           判斷一個元素上是否存在註釋

示例(annotation繼承):

   @Inherited
   @Retention(value=RetentionPolicy.RUNTIME)
   public @interface MyAnnotation {
      public String name();
   }

   @MyAnnotation(name="zsm")
   public class Person {}

   public class Student extends Person{}

   @SuppressWarnings({"unchecked","rawtypes"})
    public class AnnotationInheritTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Class clazz = Class.forName("org.zsm.annnotation.Student");
    Annotation[] annotations =  clazz.getAnnotations(); // 獲取全部的Annotations
        for(Annotation annotation : annotations){
            System.out.println(annotation);
    }

    if(clazz.isAnnotationPresent(MyAnnotation.class)){
        MyAnnotation myAnnotation = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
            System.out.println(myAnnotation.name());
        }
    }
  }
相關文章
相關標籤/搜索