1. 程式人生 > >java 註解(Annotation)

java 註解(Annotation)

    從 JDK 5.0 開始, Java 增加了對元資料(MetaData) 的支援, 也就是 Annotation(註解)。
    Annotation 其實就是程式碼裡的特殊標記, 這些標記可以在編譯, 類載入, 執行時被讀取, 並執行相應的處理. 通過使用 Annotation, 程式設計師可以在不改變原有邏輯的情況下, 在原始檔中嵌入一些補充資訊。
    Annotation 可以像修飾符一樣被使用, 可用於修飾包,類, 構造器, 方法, 成員變數, 引數, 區域性變數的宣告, 這些資訊被儲存在 Annotation 的 “name=value” 對中。
    Annotation
能被用來為程式元素(類, 方法, 成員變數等) 設定元資料。 使用 Annotation 時要在其前面增加 @ 符號, 並把該 Annotation 當成一個修飾符使用。用於修飾它支援的程式元素 三個基本的 Annotation: @Override: 限定重寫父類方法, 該註解只能用於方法 @Deprecated: 用於表示某個程式元素(類, 方法等)已過時 @SuppressWarnings: 抑制編譯器警告

自定義Annotation

定義新的 Annotation 型別使用 @interface 關鍵字
Annotation 的成員變數在 Annotation
定義中以無引數方法的形式來宣告. 其方法名和返回值定義了該成員的名字和型別. 可以在定義 Annotation 的成員變數時為其指定初始值, 指定成員變數的初始值可使用 default 關鍵字 public @interface MyAnnotation{ String name() default “atguigu"; } 沒有成員定義的 Annotation 稱為標記; 包含成員變數的 Annotation 稱為元資料 Annotation JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 介面, 該介面代表程式中可以接受註解的程式元素. 當一個 Annotation
型別被定義為執行時 Annotation 後, 該註釋才是執行時可見, 當 class 檔案被載入時儲存在 class 檔案中的 Annotation 才會被虛擬機器讀取. JDK5.0提供了專門在註解上的註解型別,分別是: Retention Target Documented Inherited @Retention: 只能用於修飾一個 Annotation 定義, 用於指定該 Annotation 可以保留多長時間, @Rentention 包含一個 RetentionPolicy 型別的成員變數, 使用 @Rentention 時必須為該 value 成員變數指定值: RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的註解 RetentionPolicy.CLASS: 編譯器將把註解記錄在 class 檔案中. 當執行 Java 程式時, JVM 不會保留註解。 這是預設值 RetentionPolicy.RUNTIME:編譯器將把註釋記錄在 class 檔案中. 當執行 Java 程式時, JVM 會保留註解. 程式可以通過反射獲取該註解 public enum RetentionPolicy{ SOURCE, CLASS, RUNTIME } @Target: 用於修飾 Annotation 定義, 用於指定被修飾的 Annotation 能用於修飾哪些程式元素. @Target 也包含一個名為 value 的成員變數。 @Documented: 用於指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文件. 定義為Documented的註解必須設定Retention值為RUNTIME。 @Inherited: 被它修飾的 Annotation 將具有繼承性.如果某個類使用了被 @Inherited 修飾的 Annotation, 則其子類將自動具有該註解。
package com.tz.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class AnnotationTest {
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,ElementType.FIELD})
    public @interface MyAnnotation{
        String names() default "Jery";
    }
}
package com.tz.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyTiger {
    String value() default "小趙";
    int age();
}



package com.tz.annotation;

import java.lang.reflect.Method;

public class Person {
    private String name;
    @MyTiger(age = 20)
    public void setName(String name){
        this.name = name;
    }
    @Override
    public String toString(){
        return "";
    }
    public static void main(String[] args) {
        //通過反射獲取方法上的註解
        Class class1 = Person.class;
        for( Method method:class1.getDeclaredMethods()){
//          System.out.println(method);
//          for(Annotation an:method.getAnnotations()){
//              System.out.println(an);
//          }

            MyTiger an = method.getAnnotation(MyTiger.class);
            //System.out.println(method+"==========="+an);
            if(an!=null){
                System.out.println(method+"==="+an.value()+"==="+an.age());
            }
        }
    }
}