從0開始復習Java(8)--Annotation

Java5增加了對MetaData的支持,也就是Annotation锋勺。
這些標記在編譯蚀瘸、類加載、運行時被讀取庶橱,并執(zhí)行相應的處理贮勃。通過使用注解,可以在不改變原邏輯的情況下悬包,在源文件中嵌入一些補充信息。

信息被存儲在Annotation的"name-value"鍵值對中馍乙。

Annotation是一個接口布近,程序可以通過反射獲取指定程序元素的Annotation對象,通過該對象獲取注解的元數據丝格。

APT(Annotation Processing Tool)

一撑瞧、基本Annotation

Annotation必須使用工具處理,工具負責提取其中的元數據显蝌,還會根據元數據增加額外的功能预伺。

5個基本的Annotation(java.lang包下):

  1. @Deprecated
  2. @Override
  3. @SuppressWarning
  4. @SafeVarargs
  5. @FunctionalInterface

@Override

強制一個子類必須覆蓋父類的方法。

@Deprecated

表示某個程序元素已過時

@SuppressWarnings

抑制編譯器警告

@SuppressWarnings(value="unchecked")
public class Test{
    public static void main(String[] args){
        //不會有任何編譯警告
        List<String> t = new ArrayList();
    }
}

@SageVararges

List list = new ArrayList<Integer>();
//未經檢查的轉換曼尊,警告
list.add(20);
List<String> ls = list;
//引起運行時異常
System.out.println(ls.get(0));

這種情況稱為"堆污染"酬诀,把一個不帶泛型的變量賦給一個帶泛型的變量時,往往會發(fā)生堆污染骆撇。

抑制堆污染警告:

  1. @SafeVarargs
  2. @SuppressWarnings("unchecked")
  3. 編譯時使用-Xlint:varargs

@FunctionaInterface

JDK的元Annotation

除了java.lang包下的5個基本注解瞒御。還有java.lang.annotation報下提供的6個Meta Annotation。五個用于修飾其他的Annotation定義神郊。@Repeatable用于定義Java8新增的重復注釋肴裙。

@Retention

用于修飾Annotation定義,指定被修飾的注解可以保留多長時間涌乳。包含一個RetentionPolicy類型的value成員變量蜻懦。value的值只能有3個:

  • RetentionPolicy.CLASS:jvm不可獲取,默認值
  • RetentionPolicy.RUNTIME:jvm可以獲取
  • RetentionPolicy.SOURCE:只保留在源代碼中夕晓,編譯器直接丟棄這種Annotation

如果要使用反射機制獲取注釋信息宛乃,則需要使用RetentionPolicy.RUNTIME

@Retention(value=RetentionPolicy.RUNTIME)
public @interface Testable(){}
@Retention(RetentionPolicy.RUNTIME)
public @interface Testable(){}

@Target

只能修飾Annotation定義,用于指定被修飾的注解能用于修飾哪些程序單元烤惊,也包含一個名為value的成員變量乔煞。取值:

  • ElementType.ANNOTATION_TYPE
  • ElementType.CONSTRUCTOR
  • ElementType.FIELD
  • ElementType.LOCAL_VARIABLE
  • ElementType.METHOD
  • ElementType.PACKAGE
  • ElementType.TYPE
  • ElementType.PARAMETER

@Documented

被該Annotation標注的Annotation類將被javadoc工具提取成文檔,如果定義Annotation類是使用了該注解柒室,則所有使用Annotation修飾的程序元素的api文檔中將會包含該Anntation說明渡贾。

@Inherited

指定被它修飾的Annotation將具有繼承性。

二雄右、自定義Annotation

public @interface Test{
}

還可以帶成員變量:

public @interface Test{
    String name();
    int age();
}

非常像定義了一個注釋接口空骚,這個注釋接口繼承了Annotation接口

也可以為成員變量指定默認值:

public @interface Test{
    String name() default "HelloWorld";
    int age() default 25;
}

提取Annotation信息

java.lang.reflect包下新增了AnnotatedElement接口,代表程序中可以接受注解的程序元素擂仍。該接口的實現類:

  • Class
  • Constructor
  • Field
  • Method
  • Package

方法:

  • <T extends Annotation> T getAnnotation(Class<T> annotationClass)
  • Annotation[] getAnnotations()
  • default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
  • default <T extends Annotation> T[] getDeclaredAnnotation(Class<T> annotationClass)
  • Annotation[] getDeclaredAnnotations()
  • default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
  • default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

Annotation的使用

java8新增的重復注釋

Java8新增的Type Annotation

三囤屹、編譯時處理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逢渔,隨后出現的幾起案子肋坚,更是在濱河造成了極大的恐慌,老刑警劉巖肃廓,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智厌,死亡現場離奇詭異,居然都是意外死亡盲赊,警方通過查閱死者的電腦和手機铣鹏,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哀蘑,“玉大人诚卸,你說我怎么就攤上這事』媲ǎ” “怎么了合溺?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缀台。 經常有香客問我辫愉,道長,這世上最難降的妖魔是什么将硝? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任恭朗,我火速辦了婚禮,結果婚禮上依疼,老公的妹妹穿的比我還像新娘痰腮。我一直安慰自己,他們只是感情好律罢,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布膀值。 她就那樣靜靜地躺著棍丐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沧踏。 梳的紋絲不亂的頭發(fā)上歌逢,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音翘狱,去河邊找鬼秘案。 笑死,一個胖子當著我的面吹牛潦匈,可吹牛的內容都是我干的阱高。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茬缩,長吁一口氣:“原來是場噩夢啊……” “哼赤惊!你這毒婦竟也來了?” 一聲冷哼從身側響起凰锡,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤未舟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掂为,有當地人在樹林里發(fā)現了一具尸體裕膀,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年菩掏,在試婚紗的時候發(fā)現自己被綠了魂角。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昵济。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡智绸,死狀恐怖,靈堂內的尸體忽然破棺而出访忿,到底是詐尸還是另有隱情瞧栗,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布海铆,位于F島的核電站迹恐,受9級特大地震影響,放射性物質發(fā)生泄漏卧斟。R本人自食惡果不足惜殴边,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珍语。 院中可真熱鬧锤岸,春花似錦、人聲如沸板乙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛋铆,卻和暖如春馋评,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刺啦。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工留特, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洪燥。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓磕秤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捧韵。 傳聞我的和親對象是個殘疾皇子市咆,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一種元程序中的元素關聯(lián)任何信息和...
    九尾喵的薛定諤閱讀 3,166評論 0 2
  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,158評論 15 116
  • 1、概述 Annotation(注解)是JDK5.0及以后版本引入的再来。它用來修飾編程元素蒙兰,如:包、類芒篷、構造方法搜变、方...
    M_JCs閱讀 645評論 0 0
  • 看了郭神公眾號推薦的注解知識,想到自己這方面有欠缺,大家一起來學習.本文主要是對自己學到的知識進行總結,和大家分享...
    藍冰海域閱讀 689評論 0 4
  • 為了提高人類幸改铀快樂的程度,我們需要掌控人類的生化機制篡帕。在過去幾十年間殖侵,人類已經開始這么做了。定期服用精神類藥物镰烧,...
    茶舍花開閱讀 224評論 0 0