Java 註解(Annotation)

gary-liu發表於2016-06-21

什麼是註解(Annotation)

  註解是 Java 5 的一個新特性。註解是插入你程式碼中的一種註釋或者說是一種後設資料(meta data)。這些註解資訊可以在編譯期使用預編譯工具進行處理(pre-compiler tools),也可以在執行期使用 Java 反射機制進行處理。(來自極客學院

註解作用

  • 生成文件。常用的有@see @param @return 等
  • 跟蹤程式碼依賴性,實現替代配置檔案功能。如spring註解配置
  • 在編譯時進行格式檢查。如@override 放在方法前,如果你這個方法並不是覆蓋了超類方法,則編譯時就能檢查出。

元註解

四個元註解:@Target, @Retention, @Documented, @Inherited

@Target

表示註解可以用於什麼地方, ElementType 列舉類定義了使用範圍如下。

 TYPE         //類、介面或enum宣告
 FIELD        //域(屬性)宣告
 METHOD       //方法宣告
 PARAMETER    //引數宣告
 CONSTRUCTOR  //構造方法宣告
 LOCAL_VARIABLE    //區域性變數宣告
 ANNOTATION_TYPE   //註釋型別宣告
 PACKAGE     //包宣告
 TYPE_PARAMETER //型別引數宣告,下面這兩個是1.8新增
 TYPE_USE    //型別使宣告

@Retention

表示在什麼級別儲存該註解資訊。可選的引數值在列舉型別 RetentionPolicy 中,如下所示。

RetentionPolicy.SOURCE //註解將被編譯器丟棄 
RetentionPolicy.CLASS //註解記錄在class檔案中,但在VM執行期不會被保留,這個是預設行為
RetentionPolicy.RUNTIME //註解記錄在class檔案,並且VM將在執行期也保留註釋,因此可以通過反射機制讀取註解的資訊。 

@Documented

將此註解包含在Javadoc中

@Inherited

使父類的註解可以繼承至子類中,注意註解繼承只針對class級別註解有效

自定義註解demo

/***********************類註解StudentInfo****/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentInfo {

    String value() default "";
}

/*********************屬性註解StudentInfo****/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentName {

    String value() default "";
}

/******************************註解使用****/
@StudentInfo("studentInfo")
public class Student {

    @StudentName("lily")
    private String name;

    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public static void main(String[] args){

        if(Student.class.isAnnotationPresent(StudentInfo.class)){
            System.out.println(Student.class.getAnnotation(StudentInfo.class).value());
        }
        Field[] fields = Student.class.getDeclaredFields();
        for(Field field : fields){
            if(field.isAnnotationPresent(StudentName.class)){
                StudentName studentName = field.getAnnotation(StudentName.class);
                System.out.println(studentName.value());
            }
        }

    }
}


[參考資料]
深入理解Java:註解(Annotation)自定義註解入門

相關文章