Java Annotation 注釋類的 Retention 和重復(fù)注釋

注釋(@annotation):

metadata 元數(shù)據(jù)格式片择,提供信息給編譯器却盘,oracle 文檔講解怎么在編程中高效地使用注釋類;
簡述:注釋是元數(shù)據(jù)邦蜜,提供描述程序的數(shù)據(jù)依鸥,并不是程序本身的一部分;被注釋的代碼悼沈,在操作上并不會有什么區(qū)別贱迟;注意:注釋類的參數(shù)的形式是:方法;并不是字段井辆,在編譯器運(yùn)行時(shí)关筒,應(yīng)該重載并調(diào)用該方法,該方法會返回一個(gè)在注釋時(shí)杯缺,寫進(jìn)入的值,如:@Schedules(dayOfMonth="last")
用途
① 給編譯器提供信息睡榆;注釋可以被編譯器使用萍肆,去探查 errors 和 SuppressWarnings袍榆;
② 編譯期和部署期加工:一些軟件工具可以處理加工注釋信息,生成代碼或者xml文件等塘揣;
③ 運(yùn)行期加工處理:可以在運(yùn)行期檢查一些注釋包雀,如springboot的那些注釋吧;
所在包:一般在 java.lang | java.lang.annotation
用的地點(diǎn):類亲铡、字段才写、方法、程序其他元素的聲明:

  • Class instance creation expression: new @Interned MyObject();
  • Type cast: myString = (@NonNull String) str奖蔓;
  • implements clause: class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
  • Thrown exception declaration: void monitorTemperature() throws @Critical TemperatureException { ... }

簡單格式:@Entityclass user{...}
注釋的元素:注釋可以包含 elements赞草,可以在注釋時(shí),輸入值:@SuppressWarnings(value="unchecked")吆鹤;
并且當(dāng)注釋只有一個(gè) String 類型的元素時(shí)厨疙,可以省略 value,如下:@SuppressWarnings("unchecked")


重復(fù)注釋(Java8支持):@Author(name = "Jane Doe")@Author(name = "John Smith")class MyClass { ... }
創(chuàng)建一個(gè)注釋:格式:@interface name{}
注釋的提取
使用Class myC=Class.forName("qualifiedName") 獲取一個(gè)類疑务;(只適合獲取1個(gè)類沾凄,想要獲取一個(gè)目錄下的所有類,應(yīng)該要后面的知識了)知允;
myC.isAnnotationPresent(CustomAnnotation.class); 通過該函數(shù)判斷指定 Annotation 是否出現(xiàn)在該類上(只適用于 Target 為 Type 的)撒蟀;
如果有這個(gè)注釋,則使用:CustomAnnotation ca = (CustomAnnotation)myC.getAnnotation(CustomAnnotation.class);
注意:該方法返回值是 <? extends Annotation>温鸽,所以需要強(qiáng)制轉(zhuǎn)換 cast牙肝;
同時(shí)在這一步也可以對類中方法 method 進(jìn)行判斷:Method[] ms = myC.getMethods(); 其方法與類上注釋判斷類似,后不詳述嗤朴;
獲取注釋的元素值:ca.value() 等等配椭;方法已經(jīng)在注釋的代碼體中寫出;
注意:能夠使用上述方法查到的注釋類雹姊,其應(yīng)該要保留到運(yùn)行時(shí)股缸,即必須顯式寫上 @Retention(RetentionPolicy.RUNTIME) 才可以(因?yàn)锧Retention隱式為保留到編譯時(shí)),否則該注釋不會被 JVM 加載到內(nèi)存中吱雏,無法使用反射敦姻,經(jīng)過實(shí)例測試,確實(shí)如此歧杏;
通過這個(gè)镰惦,就可以知道 springboot 應(yīng)該就是對 SpringApplication 類所在的目錄下,所有包中的所有類進(jìn)行掃描犬绒,判斷是否有 @Component 等注釋旺入,如果有,則使用 Class.forName() 生成該類,并注入到容器中茵瘾;


部分Java預(yù)定義的注釋:

@Deprecated :表示被注釋的元素是棄用的礼华,應(yīng)該不要使用;當(dāng)在程序中使用了被@Deprecated 注釋的類拗秘、字段圣絮、方法時(shí),編譯器會打印警告雕旨;
@Override:提示編譯器該方法會重載父類的方法扮匠;@SuppressWarnings("{...}"):使用這個(gè)可以抑制2種類型的警告:"deprecatation"、"unchecked"凡涩;
@SafeVarargs:當(dāng)應(yīng)用到方法或構(gòu)造器上棒搜,會斷言代碼在可變參數(shù)上沒有執(zhí)行潛在的危險(xiǎn)操作;當(dāng)使用該注釋時(shí)突照,與varargs相關(guān)的unchecked警告將會被抑制 suppress帮非;
@FunctionalInterface:指示一個(gè)類型是函數(shù)式接口形式,用于函數(shù)式編程中讹蘑;
@Native:用在字段-常量上末盔,指示一個(gè)字段可能援引自 native 代碼,即 C\C++座慰;應(yīng)用到其他注釋的注釋:被稱為 meta-annotations陨舱,元注釋;下面是幾個(gè)


java.lang.annotation 里面的幾個(gè)元注釋:

@Retention(保持版仔、保留游盲、注意力):隱式默認(rèn)為編譯時(shí);指示一個(gè)注釋要保留到什么時(shí)候:RetentionPolicy.SOURCE-僅到源碼時(shí)蛮粮、RetentionPolicy.CLASS-僅保存到編譯時(shí)益缎、RetentionPolicy.RUNTIME-一直保存到運(yùn)行時(shí)
說明:如果沒有使用 @Retention@Document:被其注釋的注釋,只要被使用然想,該注釋的元素就會被 Javadoc 工具記錄成文本莺奔;(默認(rèn)情況下,注釋沒有被 javadoc 工具包含)
@Target:嚴(yán)格指定一個(gè)注釋可以用在哪種Java元素上变泄,有如下Java元素:ElementType.ANNOTATIONTYPE(后面用x代表ElementType)令哟、x.TYPE、x.CONSTRUCTOR妨蛹、x.FIELD屏富、x.METHOD、x.LOCAL_VARIABLE蛙卤、x.PACKAGE狠半、x.PARAMETER
@Inherited:被這個(gè)注解注釋的注解,當(dāng)其用在一個(gè)類 A 時(shí),在 A 的子類 B 上查詢一個(gè)注釋典予,若 B 查詢不到該注釋甜滨,會前往 A 的注釋上去查詢乐严;具體用處需要深入了解瘤袖;
@Repeatable:指示一個(gè)注釋,其標(biāo)記注解一個(gè)類或聲明時(shí)昂验,可以出現(xiàn)多次捂敌;


類型檢查:JavaSE8 沒有提供內(nèi)嵌的類型檢查注釋類型,但spring有既琴,好像在SpringUtil里面占婉,包含Springboot判空、判類型的那些注釋
重復(fù)注釋 RepeatAnnotation:JavaSE8后甫恩,允許重復(fù)注釋逆济,有時(shí)候重復(fù)注釋會有用,如:@Schedule(dayOfMonth="last")@Schedule(dayOfWeek="Fri",hour="23")void invokeAtIndicatedTime(){...}上面的方法將會在每月的最后一天磺箕、每周5的23點(diǎn)進(jìn)行調(diào)用奖慌;重復(fù)注釋不僅用于方法上,還可以在任何允許注釋的地方使用重復(fù)注釋松靡;說明:在一個(gè)注釋類未聲明重復(fù)之前简僧,重復(fù)使用它會造成編譯期間錯(cuò)誤;注釋類型設(shè)計(jì):注釋類型設(shè)計(jì)時(shí)雕欺,應(yīng)該仔細(xì)考慮很多東西:是否可重復(fù)注釋岛马?可以注釋哪些位置:類?字段屠列?方法啦逆?以及注釋要保留到什么時(shí)候?


創(chuàng)建一個(gè)可重復(fù)注釋的注釋類:

① 聲明一個(gè)可重復(fù)注釋類型:import java.lang.annotation.Repeatable;@Repeatable(Schedules.class)@interface Schedule{ String dayOfMonth() default "first"; String dayOfWeek() default "Mon"; int hour() default "";}注:上述 Schedules.class 沒有寫錯(cuò)笛洛,并不是 Schedule 夏志,Schedules 也是一個(gè)注釋類,其內(nèi)部有一個(gè)返回 Schedule 數(shù)組的方法撞蜂;存儲注釋類:編譯器會存儲可重復(fù)注釋類到@Repeatable()括號中的注釋類盲镶;可以說這個(gè)類 Schedules 是容器,包含了 Schedule 數(shù)組蝌诡;
② 聲明Repeatable注釋類的容器類:@interface Schedules{ Scedule[] value()溉贿;}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浦旱,隨后出現(xiàn)的幾起案子宇色,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣蠕,死亡現(xiàn)場離奇詭異例隆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抢蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門镀层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人皿曲,你說我怎么就攤上這事唱逢。” “怎么了屋休?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵坞古,是天一觀的道長。 經(jīng)常有香客問我劫樟,道長痪枫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任叠艳,我火速辦了婚禮奶陈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虑绵。我一直安慰自己尿瞭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布翅睛。 她就那樣靜靜地躺著声搁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捕发。 梳的紋絲不亂的頭發(fā)上疏旨,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音扎酷,去河邊找鬼檐涝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛法挨,可吹牛的內(nèi)容都是我干的谁榜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凡纳,長吁一口氣:“原來是場噩夢啊……” “哼窃植!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荐糜,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巷怜,失蹤者是張志新(化名)和其女友劉穎葛超,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延塑,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绣张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了关带。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥涵。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豫缨,靈堂內(nèi)的尸體忽然破棺而出独令,到底是詐尸還是另有隱情端朵,我是刑警寧澤好芭,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冲呢,受9級特大地震影響舍败,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敬拓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一邻薯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乘凸,春花似錦厕诡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至葛作,卻和暖如春寿羞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赂蠢。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工绪穆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虱岂。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓玖院,卻偏偏與公主長得像,于是被迫代替她去往敵國和親第岖。 傳聞我的和親對象是個(gè)殘疾皇子难菌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容