java註解初步學習

定義:
註解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK5.0及之後版本引入的一個特性,與類、接口、枚舉是在同一個層次。
它能夠聲明在包、類、字段、方法、局部變量、方法參數等的前面,用來對這些元素進行說明,註釋。(「java註解」百度百科html

做用分類:
①編寫文檔:經過代碼裏標識的元數據生成文檔
②代碼分析:經過代碼裏標識的元數據對代碼進行分析
③編譯檢查:經過代碼裏標識的元數據讓編譯器能過實現基本的編譯檢查java

元註解:
元註解的做用就是註解其餘註解。java5.0定義了4個標準的meta-annotation類型,用以對其餘的annotation類型作說明,他們分別是:api

@Target:
說明了Annotation所修飾的對象的做用:用戶描述註解的使用範圍(即:被描述的註解能夠用在什麼地方)
取值(ElementType)有:
 1.CONSTRUCTOR:用於描述構造器
 2.FIELD:用於描述域
 3.LOCAL_VARIABLE:用於描述局部變量
 4.METHOD:用於描述方法
 5.PACKAGE:用於描述包
 6.PARAMETER:用於描述參數
 7.TYPE:用於描述類、接口(包括註解類型) 或enum聲明數組

@Retention:
做用:表示須要在什麼級別保存該註釋信息,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)
取值(RetentionPolicy)
1.SOURCE:在源文件中有效
2.CLASS:在class文件中有效
3.RUNTIME:在運行時有效
取RUNTIME時,註解處理器能夠經過反射,獲取到該註解的屬性值,作一些運行時的邏輯處理。工具

@Documented:
這是一個標記註解
用於描述其它類型的annotation應該被做爲標註的程序成員的公共api,能夠文檔化測試

@Inherited:
標記註解
用該註解修飾的註解,會被子類繼承。this

自定義註解:code

使用@interface來聲明一個註解。其中的每個方法其實是聲明瞭一個配置參數。方法的名稱就是參數的名稱。返回值的類型就是參數的類型。(返回值只能是基本類型、class、String、enum),能夠用default來聲明參數的默認值.htm

格式
public @interface 註解名 {定義體}
註解參數支持的數據類型:
1.全部基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上全部類型的數組
只能用public或者default這兩個訪問權修飾.註解元素必須有肯定的默認值,要麼在定義的時候指定,要麼在使用的時候指定。對象

例子:

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

//用於描述域
@Target(ElementType.FIELD)
// 運行是有效
@Retention(RetentionPolicy.RUNTIME)
public @interface Student {
    public enum Sex {
        MAN, WOMAN
    }

    /**
     * 1.參數成員只能用基本類型String,Enum,Class,annotations等數據類型,以及這一些類型的數組
     * 2.只能用public或默認(default)這兩個訪問權修飾. 3.若是隻有一個參數成員,最好把參數名稱設爲"value"
     */
    String name() default "";

    // public修飾
    public int age() default 18;

    public Sex sex() default Sex.MAN;

}

註解處理器

這是一個本身編寫的工具類,經過註解處理器對程序元素中的註解進行操做。
得到Annotation信息的方法:
方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定類型的註解,若是該類型註解不存在,則返回null。

方法2:Annotation[] getAnnotations():返回該程序元素上存在的全部註解。

方法3:boolean is AnnotationPresent(Annotation):判斷該程序元素上是否包含指定類型的註解,存在則返回true,不然返回false.

方法4:Annotation[] getDeclaredAnnotations():返回直接存在於此元素上的全部註釋。與此接口中的其餘方法不一樣,該方法將忽略繼承的註釋。(若是沒有註釋直接存在於此元素上,則返回長度爲零的一個數組。)該方法的調用者能夠隨意修改返回的數組;這不會對其餘調用者返回的數組產生任何影響。

public class StudentInfoUtil {

    public static void getStudentInfo(Class<?> clazz) {
        // 獲取程序對象全部的Field註釋
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 判斷是否爲Student註釋
            if (field.isAnnotationPresent(Student.class)) {
                // 獲取Annotation對象
                Student student = field.getAnnotation(Student.class);
                System.out.println("姓名" + student.name() + "年齡" + student.age()
                        + "性別" + student.sex());
            }
        }
    }

}

下面寫個實例看它怎麼用,先寫一個student實體bean

public class StudentBean {

    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

再寫個測試

public class Test {
    @Student(name = "Snail", age = 18, sex = Sex.MAN)
    private StudentBean student01;
    @Student(name = "Snail2", age = 19, sex = Sex.MAN)
    private StudentBean student02;

    public static void main(String[] args) {
        StudentInfoUtil.getStudentInfo(Test.class);
    }

}

輸出以下:

姓名Snail年齡18性別MAN
姓名Snail2年齡19性別MAN

能夠看到,這裏註解能夠省去重複聲明賦值的麻煩。

參考
深刻理解Java:註解(Annotation)自定義註解入門
深刻理解Java:註解(Annotation)--註解處理器

相關文章
相關標籤/搜索