Annotation之自定義

 Annotation之自定義

 

定義Annotation的語法:

Public @interface Annotation的名稱{}

如:public @interface Override

public @interface MyAnnotation {

}

任何一個自定的Anntation都是繼承了java.lang.annotation.Annotation接口

一個Annotation如果要想起作用,則肯定要依靠反射機制,通過反射可以取得在一個方法上聲明的Annotation的全部內容。

 

具體實例

 

自定義Annotation:MyAnnotation

  1. import java.lang.annotation.Documented; 
  2. import java.lang.annotation.ElementType; 
  3. import java.lang.annotation.Retention; 
  4. import java.lang.annotation.RetentionPolicy; 
  5. import java.lang.annotation.Target; 
  6.  
  7. @Target(ElementType.CONSTRUCTOR) 
  8. @Retention(RetentionPolicy.RUNTIME) 
  9. @Documented 
  10. public @interface MyAnnotation { 
  11. public String name() default "singsong"

1  @Target(ElementType.CONSTRUCTOR)

@Target指示註釋類型所適用的程序元素的種類。如果註釋類型聲明中不存在 Target 元註釋,則聲明的類型可以用在任一程序元素上。如果存在這樣的元註釋,則編譯器強制實施指定的使用限制。參數是ElementType: java.lang.annotation.ElementType

定義:public enum ElementTypeextends Enum<ElementType>是枚舉類型

ElementType.CONSTRUCTOR代表此Annotation必須聲明在構造方法聲明的上面,而不能寫在任何的method{}(方法)或者是field(屬性)的上方。

@Target:  表示該註解可以用於什麼地方。可用ElementType枚舉類型主要有:

              TYPE : 類、接口或enum聲明

              FIELD: (屬性)聲明

              METHOD: 方法聲明

              PARAMETER: 參數聲明

              CONSTRUCTOR: 構造方法聲明

              LOCAL_VARIABLE:局部變量聲明

              ANNOTATION_TYPE:註釋類型聲明

              PACKAGE: 包聲明

2@Retention(RetentionPolicy.RUNTIME)

@Retention指示註釋類型的註釋要保留多久。如果註釋類型聲明中不存在 Retention 註釋,則保留策略默認爲 RetentionPolicy.CLASS 只有元註釋類型直接用於註釋時,Target 元註釋纔有效。如果元註釋類型用作另一種註釋類型的成員,則無效。

Retention設爲了RUNTIME,代表此annotation的具體實現可以在運行時用類反射來實現

RetentionPolicy定義:public enum RetentionPolicyextends Enum<RetentionPolicy>屬於枚舉類型

可用RetentionPolicy枚舉類型主要有:

             SOURCE: 註解將被編譯器丟棄。

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

             RUNTIME: VM將在運行時也保存註解(如果需要通過反射讀取註解,則

使用該值)

3. @Documented

@Documented:  將此註解包含在Javadoc中。

4. Annotation需要聲明:public @interface MyAnnotation{***}

 

使用自定義的MyAnnotation

  1. public class Person { 
  2.     @MyAnnotation(name = "The person's name is singsong"
  3.     Person() { 
  4.     } 
  5.     public String name; 

 

使用java反射機制來實現MyAnnotation

  1. import java.lang.reflect.Method; 
  2. public class TestMyAnnotation { 
  3.     public static void main(String[] args) throws Exception { 
  4.         Class<Person> c = Person.class
  5.         Method method = c.getMethod("getName"); 
  6.         MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class); 
  7.         System.out.println(myAnnotation.name()); 
  8.     } 

運行結果:

The person's name is singsong

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章