#翻譯#使用注解處理器生成代碼-1 注解類型

?原文地址如下:摸我
?我希望以此篇博文作為基于注解處理器生成代碼系列博文的開篇硬鞍,給大家展示注解處理器有多么強(qiáng)大镜悉,并在最后使用這項技術(shù)來在編譯時刻生成android代碼
?在這個系列博文中灵迫,我們會:

  • 介紹Java語言中的注解
  • 理解注解的基本用法和作用域
  • 了解Annotation Processor基礎(chǔ)知識和作用
  • 學(xué)習(xí)如何在命令行,Eclipse,Maven中運(yùn)行Annotation Processors
  • 學(xué)習(xí)如何使用Annotation Processors來生成代碼
  • 學(xué)習(xí)如何Apache Velocity模版來生成代碼

簡介

?注解首先在第三版Java Language Specification中被提出,并在java 5中被實(shí)現(xiàn)。
?使用注解我們可以給源代碼添加元數(shù)據(jù)信息被丧,比如構(gòu)造或者部署信息盟戏,配置屬性,編譯特性或者代碼質(zhì)量檢查甥桂。
?不像Javadocs柿究,注解是強(qiáng)類型的,每個注解都對應(yīng)一個預(yù)先定義好的注解類型黄选。除此之外蝇摸,程序可以在運(yùn)行時獲得注解信息,Javadocs不行办陷。

注解語法

?注解通常出現(xiàn)在被注解代碼片段之前貌夕,單獨(dú)成行,并且和代碼片段有相同的縮進(jìn)懂诗。
?注解可以應(yīng)用到包蜂嗽,類型(類,接口殃恒,枚舉,注解類型)辱揭,變量(對象离唐,局部變量-包括定義在循環(huán)結(jié)構(gòu)中的變量),構(gòu)造函數(shù)问窃,方法亥鬓,和參數(shù)。
?注解的最簡單形式是不帶任何元素域庇,比如:

@Override()
    public void theMethod() {…}

?在這種情況下嵌戈,括號可以被省略。

@Override
    public void theMethod() {…}

?注解可以包括通過冒號分離的鍵值對數(shù)據(jù)听皿,類型可以是基礎(chǔ)類型熟呛,字符串,枚舉尉姨,和數(shù)組:

@Author(name = "Albert",
            created = "17/09/2010",
            revision = 3,
            reviewers = {"George", "Fred"})
    public class SimpleAnnotationsTest {…}

?當(dāng)注解只有一個元素并且其名字是value庵朝,那么它就可以被省略:

@WorkProduct("WP00000182")
    @Complexity(ComplexityLevel.VERY_SIMPLE)
    public class SimpleAnnotationsTest {…}

?注解可以定義它的元素的默認(rèn)值,有默認(rèn)值的元素可以在注解聲明使用時被省略又厉。
?比如九府,假設(shè)注解Author定義了revision(默認(rèn)為1)和reviewers(默認(rèn)為空的字符串?dāng)?shù)組),下邊的兩個注釋聲明是相同的:

@Author(name = "Albert",
            created = "17/09/2010",
            revision = 1,
            reviewers = {})
    public class SimpleAnnotationsTest() {…}
    @Author(name = "Albert",        // defaults are revision 1
            created = "17/09/2010") // and no reviewers
    public class SimpleAnnotationsTest() {…}

注解的典型使用

?有三類注解類型在Java Language Specification中被定義覆致,它們提供給java的編譯器使用:

  • @Deprecated:表明被標(biāo)記的元素不應(yīng)該再被使用侄旬。當(dāng)你使用被標(biāo)記元素時,編譯器會給出警告煌妈。也可以使用在Javadoc中儡羔,解釋標(biāo)記元素不能在使用的原因宣羊。
  • @Override:表面被標(biāo)記元素為重載了超類中的元素
  • @SuppressWarnings:讓編譯器忽略標(biāo)記元素會產(chǎn)生的一些特定警告

?自從注解被引入,很多庫和框架都在其最新版本中添加了注解笔链。通過在代碼中使用注解段只,這些庫或者框架可以減少或者去除配置文件的使用。
&emsp鉴扫;最有代表性的幾個庫或框架如下:

  • Java Enterprise Edition and its main components – Enterprise JavaBeans, Java Persistence API or Web Services API’s.
  • Spring Framework – used thoroughly for configuration, dependency injection and inversion of control in the core framework and in other Spring projects.
  • Seam, Weld, Guice.
  • Apache Struts 2.

注解類型

?注解類型(Annotation Type)是定義自定義注解的特殊接口(interface)赞枕。
?一個注解類型使用@interface來定義:

public @interface Author {
        String name();
        String created();
        int revision() default 1;
        String[] reviewers() default {};
    }
    public @interface Complexity {
        ComplexityLevel value() default ComplexityLevel.MEDIUM;
    }
    public enum ComplexityLevel {
        VERY_SIMPLE, SIMPLE, MEDIUM, COMPLEX, VERY_COMPLEX;
    }

?注解類型和常規(guī)的接口有一些不同的地方:

  • 只有基礎(chǔ)類型,字符串坪创,枚舉炕婶,類常量和上述類型的數(shù)組允許在注解定義中使用,一般的類和對象不允許使用莱预,雙重數(shù)組也不允許柠掂。
  • 注解元素的定義語法和類方法的語法相似,但是注意依沮,注解元素的定義不包括修飾符和參數(shù)涯贞。
  • 默認(rèn)值是使用default關(guān)鍵字定義的,其后的值必須是字面量危喉,數(shù)組初始器和枚舉值宋渔。

?枚舉類型可以在注解內(nèi)部進(jìn)行定義:

public @interface Complexity {
        public enum Level {
            VERY_SIMPLE, SIMPLE, MEDIUM, COMPLEX, VERY_COMPLEX;
        }
    …

用來定義注解的注解

?JDK中預(yù)先定義了一些用來修改自定義注解行為的注解:

  • @Retention:表明被標(biāo)記的注解信息會保存多長時間,一些可能的值如下:CLASS (默認(rèn)選項辜限,注解信息保存到class文件中皇拣,但是無法在運(yùn)行時獲得), SOURCE (當(dāng)class文件被創(chuàng)建時被編譯器拋棄) and RUNTIME (在程序運(yùn)行時可以獲得).
  • @Target:表明注解可以標(biāo)記元素的類型,可能的值為枚舉類型ElementType的值:ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER and TYPE.
    ?下一篇博文為《注解處理器》薄嫡,稍后會給出氧急。


(1) ”The Java Language Specification, Third Edition” is available for free download here.
?Update: new link to relevant JLS section in his new home at Oracle site here.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市毫深,隨后出現(xiàn)的幾起案子吩坝,更是在濱河造成了極大的恐慌,老刑警劉巖费什,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钾恢,死亡現(xiàn)場離奇詭異,居然都是意外死亡鸳址,警方通過查閱死者的電腦和手機(jī)瘩蚪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稿黍,“玉大人疹瘦,你說我怎么就攤上這事⊙睬颍” “怎么了言沐?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵邓嘹,是天一觀的道長。 經(jīng)常有香客問我险胰,道長汹押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任起便,我火速辦了婚禮棚贾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榆综。我一直安慰自己妙痹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布鼻疮。 她就那樣靜靜地躺著怯伊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪判沟。 梳的紋絲不亂的頭發(fā)上耿芹,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音挪哄,去河邊找鬼猩系。 笑死,一個胖子當(dāng)著我的面吹牛中燥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塘偎,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疗涉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吟秩?” 一聲冷哼從身側(cè)響起咱扣,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涵防,沒想到半個月后闹伪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮池,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年偏瓤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椰憋。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡厅克,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橙依,到底是詐尸還是另有隱情证舟,我是刑警寧澤硕旗,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站女责,受9級特大地震影響漆枚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抵知,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一墙基、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辛藻,春花似錦碘橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氮墨,卻和暖如春纺蛆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背规揪。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工桥氏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人猛铅。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓字支,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奸忽。 傳聞我的和親對象是個殘疾皇子堕伪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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