Java之Annotation

首先可以使用下面四個方法來訪問Annotation的信息

  • ** <A extends Annotation> A getAnnotation(Class<A> annotationType) **
    返回該程序元素上存在的形入、指定類型的注解全跨,如果該類型注解不存在,則返回null
  • ** Annotation[] getAnnotations() **
    返回該程序元素上存在的所有注解亿遂。
  • ** boolean isAnnotationPresent(Class<? extends Annotation> annotationType) **
    判斷該程序元素上是否包含指定類型的注解浓若,存在則返回true,否則返回false.
  • Annotation[] getDeclaredAnnotations()
    返回直接存在于此元素上的所有注釋蛇数。與此接口中的其他方法不同挪钓,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上耳舅,則返回長度為零的一個數組碌上。)該方法的調用者可以隨意修改返回的數組;這不會對其他調用者返回的數組產生任何影響浦徊。

Java5.0定義了4個標準的meta-annotation類型對 annotation類型作說明

** 1. @Target **: 說明了Annotation所修飾的對象范圍取值(ElementType)有:
    1.CONSTRUCTOR:用于描述構造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部變量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述參數
    7.TYPE:用于描述類馏予、接口(包括注解類型) 或enum聲明

2. @Retention : 定義了該Annotation被保留的時間長短:某些Annotation僅出現(xiàn)在源代碼中后雷,而被編譯器丟棄蜀肘;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會被虛擬機忽略囤萤,而另一些在class被裝載時將被讀却砍觥(請注意并不影響class的執(zhí)行蚯妇,因為Annotation與class在使用上是被分離的)取值(RetentionPoicy)有:
    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在運行時有效(即運行時保留)

3. @Documented :用于描述其它類型的annotation應該被作為被標注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化暂筝。Documented是一個標記注解箩言,沒有成員。

4. @Inherited :是一個標記注解焕襟,@Inherited闡述了某個被標注的類型是被繼承的陨收。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation將被用于該class的子類鸵赖。注意:@Inherited annotation類型是被標注過的class的子類所繼承务漩。類并不從它所實現(xiàn)的接口繼承annotation,方法并不從它所重載的方法繼承annotation它褪。當@Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME饵骨,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個@Inherited annotation類型的annotation時茫打,反射代碼檢查將展開工作:檢查class和其父類居触,直到發(fā)現(xiàn)指定的annotation類型被發(fā)現(xiàn)妖混,或者到達類繼承結構的頂層。

注解可以支持的數據類型

1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上所有類型的數組

Annotation類型里面的參數轮洋,方法設定

  • 只能用public或默認(default)這兩個訪問權修飾.例如,String value();這里把方法設為defaul默認類型

  • 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和 String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這里的參數成員就為String;

  • 如果只有一個參數成員,最好把參數名稱設為"value",后加小括號.

  • 在每一個注解中每一個方法其實就是一個變量

如下是一個注解使用例子

//定義了一個學生專業(yè)的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentMajor {
    public enum Major {計算機, 軟件, 經管}//專業(yè)的枚舉
    Major studentMajor() default Major.經管;//學生的專業(yè)
}
//學生名字注解類
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentName {
    String value() default "";
}
//學生信息注解類
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StudentData {
    public int age() default -1;

    public String address() default "";

    public int height() default -1;
}
//學生類
public class Student {
    @StudentName("luoweidong")
    private String studentName;

    @StudentMajor(studentMajor = StudentMajor.Major.計算機)
    private String studentMajor;

    @StudentData(age = 18, address = "江西", height = 170)
    private String studentData;
}
//注解處理類
public class StudentInfoUtils {
    public static void showData(Class<?> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {

            if (field.isAnnotationPresent(StudentName.class)) {
                StudentName studentName = field.getAnnotation(StudentName.class);
                Log.d("lwd", studentName.value());
            }

            if (field.isAnnotationPresent(StudentMajor.class)) {
                StudentMajor studentMajor = field.getAnnotation(StudentMajor.class);
                Log.d("lwd", studentMajor.studentMajor() + "");
            }

            if (field.isAnnotationPresent(StudentData.class)) {
                StudentData studentData = field.getAnnotation(StudentData.class);
                Log.d("lwd", studentData.age() + studentData.address() + studentData.height());
            }
        }
    }
}
//測試代碼
public class Test {
    public static void main(String[] args) {
        StudentInfoUtils.showData(Student.class);
    }
}
參考博客

深入理解Java:注解(Annotation)1
深入理解Java:注解(Annotation)2

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末制市,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子弊予,更是在濱河造成了極大的恐慌祥楣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汉柒,死亡現(xiàn)場離奇詭異荣堰,居然都是意外死亡,警方通過查閱死者的電腦和手機竭翠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門振坚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斋扰,你說我怎么就攤上這事渡八。” “怎么了传货?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵屎鳍,是天一觀的道長。 經常有香客問我问裕,道長逮壁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任粮宛,我火速辦了婚禮窥淆,結果婚禮上,老公的妹妹穿的比我還像新娘巍杈。我一直安慰自己忧饭,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布筷畦。 她就那樣靜靜地躺著词裤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳖宾。 梳的紋絲不亂的頭發(fā)上吼砂,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音鼎文,去河邊找鬼渔肩。 笑死,一個胖子當著我的面吹牛漂问,可吹牛的內容都是我干的赖瞒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚤假,長吁一口氣:“原來是場噩夢啊……” “哼栏饮!你這毒婦竟也來了?” 一聲冷哼從身側響起磷仰,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袍嬉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灶平,有當地人在樹林里發(fā)現(xiàn)了一具尸體伺通,經...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年逢享,在試婚紗的時候發(fā)現(xiàn)自己被綠了罐监。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞒爬,死狀恐怖弓柱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情侧但,我是刑警寧澤矢空,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站禀横,受9級特大地震影響屁药,放射性物質發(fā)生泄漏。R本人自食惡果不足惜柏锄,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一酿箭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趾娃,春花似錦七问、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饶氏,卻和暖如春讥耗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疹启。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工古程, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊崖。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓挣磨,卻偏偏與公主長得像雇逞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茁裙,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,158評論 15 116
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,166評論 0 2
  • 整體Retrofit內容如下: 1塘砸、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 6,479評論 4 31
  • 前言 現(xiàn)在在我們構建自己或公司的項目中晤锥,或多或少都會依賴幾個流行比較屌的第三方庫掉蔬,比如:Butter Knife、...
    戴定康閱讀 3,938評論 0 17
  • “我都忘了什么時候開懷笑過了矾瘾∨危”看到你發(fā)的信息,我苦笑回復壕翩,“我也是蛉迹。”簡單的對話放妈,卻讓人陷入沉思婿禽,我們怎么就這樣...
    蘇夏閱讀 1,065評論 2 22