Blog 註解

 註解是以前忽略的一個東西,然而今後參與到正規團隊開發中應該會比較重要,所以先學一學

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Outer {
    String value() default "report";
    int time() default 0;
}

@Outer
public class Ans {
    public static void main(String[] args) {
        test1();
        test2();
    }

    static void test0() {
        //註解添加於java SE5
        //註解是一種特殊註釋,註釋會被編譯器忽略,註解會被打包入class文件,因此註解是一種用作標註的元數據。
        //注意!JVM不會處理註解,也不識別註解
        //註解分爲三類,1.由編譯器使用的註解,@Override,@SuppressWarnings等,他們不進入class文件,編譯後被丟棄
        //2.處理class文件使用的註解,有些會進入class文件,一般都用於底層代碼
        //3.程序運行時讀取的註解,加載後存在於JVM,是最常用的註解(java代碼讀取註解實現的功能,JVM不會識別註解)
        //定義註解可以定義其參數,包括基本類型,String,枚舉類型,以及以上三種類型的數,參數都是常數
        //沒有定義的參數會使用默認值
    }

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Report {
        String value() default "report";
        int time() default 0;
    }

    @interface TT {}            //博客中說所有註解都要定義Target和Retention,但是這個沒有定義也可以使用,不過不知道這樣的註解有沒有實際意義

    static void test1() {
        //我們用@interface定義註解,同時使用@Target等元註解修飾定義的註解
        //註解中最常用的值最好定義爲value,所有值最好有default定義的默認值
        //查看文件會發現存在名爲Report.class與TT.class的文件,說明註解也是一個類
        class A {
            //! @interface Report {}
        }
        //! @interface Report {}
        //事實證明註解的定義不能存在於方法中(不管是方法中,還是方法的內部類中都不行)
    }
    @TT
    @Report
    int i;

    static void test2() {
        //獲取註解也是使用反射來獲取
        System.out.println(Ans.class.isAnnotationPresent(Report.class));        //查看一個註解是否註解了某個類,對於方法和域也相似
        System.out.println(Ans.class.isAnnotationPresent(Outer.class));

        Outer outer = Ans.class.getAnnotation(Outer.class);                     //獲得一個類的註解,如果註解不存在就返回null
        System.out.println(outer.value());                                      //註解不能直接作用於代碼,需要變相相關代碼才能使註解生效
    }
}

 

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