Java Annotation淺析

  

什麼是Annotation

(1)註解不是程序自己(也就是說Annotation不能影響程序代碼的執行,不管增長、刪除 Annotation,代碼都始終如一的行),能夠對程序做出解釋(和註釋沒區別)
(2)能夠被其餘程序(好比:編譯器等)讀取

註解的做用

(1)生成文檔。如生成javadoc的@see @param @return
(2)跟蹤代碼依賴性,實現替代配置文件的功能。如spring中@Service等註解。
(3)在編譯時期進行格式檢查。如@Override放在方法前,若是你的方法不是覆蓋超類的方法,編譯時期就會報錯。

如何使用註解

「@註釋名」在代碼中存在,還能夠添加一些參數.
例如:@SuppreWarning(value="unchecked")

註解能夠附加在package,class,method,field等上面,至關於給它們添加了額外的輔助信息,咱們能夠經過反射機制編程實現對這些元數據的訪問。
class Demo{
    @Override
    public Stirng toStirng(){
        return "";
    }
}

java內置註解

@Override
只使用於修飾方法,表示一個方法聲明打算重寫超類中的另外一個方法聲明

@Deprecated
修飾方法,屬性,類,表示不鼓勵程序員使用這樣的元素

@SuppressWarnings抑制編譯期發出某些警告


| ----------- | --------------------------------------------------- |
| deprecation | 過期的類或方法警告                                     |
| ----------- | --------------------------------------------------- |
| unchecked   | 未檢查的轉換時警告                                     |
| ----------- | --------------------------------------------------- |
| fallthrough | switch語句穿透警告                                    |
| ----------- | --------------------------------------------------- |
| pat         | 類路徑、源文件路徑等有不存在的路徑時的警告                 |
| ----------- | --------------------------------------------------- |
| serial      | 在可序列化的類上缺乏serialVersionUID定義時警告           |      
| ----------- | --------------------------------------------------- |
| all         | 關於上面的全部狀況的警告                                |
| ----------- | --------------------------------------------------- |

自定義註解

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


| --------------------------- | ---------------------------------- |
| ElemenetType.FIELD          | 域聲明(包括 enum 實例)              |
| --------------------------- | ---------------------------------- |
| ElemenetType.LOCAL_VARIABLE | 局部變量聲明                         |
| --------------------------- | ---------------------------------- |
| ElemenetType.CONSTRUCTOR    | 構造器                              |
| --------------------------- | ---------------------------------- |
| ElemenetType.METHOD         | 方法聲明                            |
| --------------------------- | ---------------------------------- |
| ElemenetType.PACKAGE        | 包聲明                              |
| --------------------------- | ---------------------------------- |
| ElemenetType.PARAMETER      | 參數聲明                            |
| --------------------------- | ---------------------------------- |
| ElemenetType.TYPE           | 類,接口(包括註解類型)或enum聲明      |


| ------- | ---------------------------------------- |
| SOURCE  | 源文件中保留,class文件不保留                |
| ------- | ---------------------------------------- |
| CLASS   | class文件保留,不加載到內存,運行時不保留      |
| ------- | ---------------------------------------- |
| RUNTIME | 運行時能夠經過反射得到註解內容                |

自定義註解默認值問題: html

註解必需要有值。咱們定義註解元素時,常常使用空字符串、0做爲默認值。 也常常使用負數(好比:-1)表示不存在的含義。java

案例:自定義註解而且使用反射處理讀取註解內容

/**
 * 學生名註解
 */

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentName {
    String value() default "";
}

/**
 * 學生性別註解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StudentSex {
    /**
     * 性別枚舉
     */
    public enum Sex {GRIL, BOY};

    /**
     * 性別屬性
     * @return
     */

    Sex studentSex() default Sex.BOY;
}

/**
 * 學校註解
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface School {
    /**
     * 學校名稱
     */
    public String name() default "";

    /**
     * 學校排名
     * @return
     */
    public int id() default -1;
}

/**
 * 使用註解
 */
public class Student {
    @StudentName("ximing")
    private String name;
    @StudentSex(studentSex = StudentSex.Sex.GRIL)
    private String sex;
    @School(name = "北大", id = 1)
    private String school;
}

/**
 * 讀取註解信息
 */
public class HandleAnnotation {
    public static void getStudentInfo(Class<?> clazz){
        String strStudentName = "學生名稱: ";
        String strStudentSex = "學生性別: ";
        String strStudentSchool = "學生所在學校: ";

        Field[]  fields  = clazz.getDeclaredFields();

        for(Field field : fields){
            if(field.isAnnotationPresent(StudentName.class)){
                StudentName studentName =  field.getAnnotation(StudentName.class);
                strStudentName = strStudentName + studentName.value();
                System.out.println(strStudentName);
            }else if(field.isAnnotationPresent(StudentSex.class)){
                StudentSex studentSex =  field.getAnnotation(StudentSex.class);
                strStudentSex = strStudentSex + studentSex.studentSex().toString();
                System.out.println(strStudentSex);
            }else if(field.isAnnotationPresent(School.class)){
                School school = field.getAnnotation(School.class);
                strStudentSchool = strStudentSchool + "學校名稱: " + school.name().toString() +
                        "排名: " + school.id();
                System.out.println(strStudentSchool);
            }
        }

    }

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

//執行結果
學生名稱: ximing
學生性別: GRIL
學生所在學校: 學校名稱: 北大排名: 1

推薦博客:http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html程序員

相關文章
相關標籤/搜索