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

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

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

簡介

?注解首先在第三版Java Language Specification中被提出,并在java 5中被實現。
?使用注解我們可以給源代碼添加元數據信息,比如構造或者部署信息,配置屬性,編譯特性或者代碼質量檢查。
?不像Javadocs,注解是強類型的,每個注解都對應一個預先定義好的注解類型。除此之外,程序可以在運行時獲得注解信息,Javadocs不行。

注解語法

?注解通常出現在被注解代碼片段之前,單獨成行,并且和代碼片段有相同的縮進。
?注解可以應用到包,類型(類,接口,枚舉,注解類型),變量(對象,局部變量-包括定義在循環結構中的變量),構造函數,方法,和參數。
?注解的最簡單形式是不帶任何元素,比如:

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

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

@Override
    public void theMethod() {…}

?注解可以包括通過冒號分離的鍵值對數據,類型可以是基礎類型,字符串,枚舉,和數組:

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

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

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

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

@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:表明被標記的元素不應該再被使用。當你使用被標記元素時,編譯器會給出警告。也可以使用在Javadoc中,解釋標記元素不能在使用的原因。
  • @Override:表面被標記元素為重載了超類中的元素
  • @SuppressWarnings:讓編譯器忽略標記元素會產生的一些特定警告

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

  • 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;
    }

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

  • 只有基礎類型,字符串,枚舉,類常量和上述類型的數組允許在注解定義中使用,一般的類和對象不允許使用,雙重數組也不允許。
  • 注解元素的定義語法和類方法的語法相似,但是注意,注解元素的定義不包括修飾符和參數。
  • 默認值是使用default關鍵字定義的,其后的值必須是字面量,數組初始器和枚舉值。

?枚舉類型可以在注解內部進行定義:

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

用來定義注解的注解

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

  • @Retention:表明被標記的注解信息會保存多長時間,一些可能的值如下:CLASS (默認選項,注解信息保存到class文件中,但是無法在運行時獲得), SOURCE (當class文件被創建時被編譯器拋棄) and RUNTIME (在程序運行時可以獲得).
  • @Target:表明注解可以標記元素的類型,可能的值為枚舉類型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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,258評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,234評論 2 375

推薦閱讀更多精彩內容