注解基礎知識

注解是一種能被添加到java代碼中的元數據,類、方法、變量、參數和包都可以用注解來修飾。注解對于它所修飾的代碼并沒有直接的影響。

作用

1.生成幫助文檔。這是最常見的,也是 Java 最早提供的注解。常用的有 @see、@param 和 @return 等;
2.跟蹤代碼依賴性,實現替代配置文件功能。作用就是減少配置。現在的框架基本都使用了這種配置來減少配置文件的數量;
3.在編譯時進行格式檢查。如把 @Override 注解放在方法前,如果這個方法并不是重寫了父類方法,則編譯時就能檢查出。

注解的特點

  • 注解可以在變量,方法,類之上加載
  • 注解可以有屬性也可以沒有屬性 @Override @Test(timeout=1000)
  • 注解有作用范圍(源碼,編譯期間,運行期間)

注解的分類

JDK的,自定義的,第三方的(比如框架)

JDK:

元注解:定義其他注解的注解


image.png
  • @Retention - 標識這個注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運行時可以通過反射訪問。
  • @Documented - 標記這些注解是否包含在用戶文檔中。
  • @Target - 標記這個注解應該是哪種 Java 成員。
  • @Inherited - 標記這個注解是繼承于哪個注解類(默認注解并沒有繼承于任何子類)

系統注解:


image.png
  • Override - 檢查該方法是否是重載方法。如果發現其父類,或者是引用的接口中并沒有該方法時,會報編譯錯誤。
  • @Deprecated - 標記過時方法。如果使用該方法,會報編譯警告。
  • @SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。

三方注解:

框架里面定義的注解,如ButterKnife 框架里面bindview等

自定義注解

定義注解三板斧:
定義注解——相當于定義標記
配置注解——把標記打在需要用到的程序代碼中;
解析注解——在編譯期(別忘了AutoService注冊)或運行時檢測到標記,并進行特殊操作

編譯期注解(APT)原理

APT即為Annotation Processing Tool,它是javac的一個工具,中文意思為編譯時注解處理器。APT可以用來在編譯時掃描和處理注解。通過APT可以獲取到注解和被注解對象的相關信息,在拿到這些信息后我們可以根據需求來自動的生成一些代碼,省去了手動編寫。注意,獲取注解及生成代碼都是在代碼編譯時候完成的,相比反射在運行時處理注解大大提高了程序性能。APT的核心是AbstractProcessor類。

當通過javac將.java文件編譯成.class文件時。編譯過程大致可以分為3個過程:

  • 解析與填充符號表過程
  • 插入式注解處理器的注解處理過程
  • 分析與字節碼生成過程

而插入式注解處理器的注解處理過程主要就是對AbstractProcessor這個類的調用。所以,當我們自定義這個類的子類的時候,在編譯器就會執行這個類中的方法
從JDK1.6開始,提供了插入式注解處理器的標準API在編譯期間對注解進行處理

通過注解處理器API實現一個編譯器插件,需要繼承抽象類javax.annotation.processing.AbstractProcessor,重寫抽象方法process(),這個方法在javac編譯器在執行注解處理器代碼時調用。這個方法有兩個參數,第一個參數表示注解處理器所有處理的注解集合,第二個參數roundEnvironment表示當前這個Round中的語法樹節點,每個語法樹節點在這里表示一個Element。這里的Element包括如下元素:包(PACKAGE)、枚舉(ENUM)、類(CLASS)、注解(ANNOTATION_TYPE)、接口(INTERFACE)等。

在android開發中使用的AbstractProcessor這個類是JDK通過javac編譯的時候用來處理注解的。而android sdk中刪除了這個類,所以我們需要通過創建java library庫來獲取這個.

AbstractProcessor的子類已經有了,但是要想在編譯時期被執行,需要向javac注冊我們這個自定義的注解處理器(即將這個庫變成jar包的形式),這樣,在javac編譯時,才會調用到我們這個自定義的注解處理器方法。

手動注冊:

  • 在src/main目錄下創建resources/META-INF/services/javax.annotation.processing.Processor文件。

  • 在javax.annotation.processing.Processor中寫入自定義的Processor的全名,如果有過個Processor的話,每行寫一個。如:com.soulmate.processor.MyProcessor

自動注冊:

使用AutoService注解,AutoService會自動在META-INF文件夾下生成Processor配置信息文件,該文件里就是實現該服務接口的具體實現類。而當外部程序裝配這個模塊的時候,

就能通過該jar包META-INF/services/里的配置文件找到具體的實現類名,并裝載實例化,完成模塊的注入。應用依賴如下
compile 'com.google.auto.service:auto-service:1.0-rc2'

APT應用場景

APT技術被廣泛的運用在Java框架中,包括Android項目以及Java后臺項目,除了上面我們提到的ButterKnife之外,像EventBus 、Dagger2以及阿里的ARouter路由框架等都運用到APT技術

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

推薦閱讀更多精彩內容

  • 備注: 本文大部分內容及代碼均來自網上,具體引用看末尾 8.參考引用** 概念及作用 JDK注解 元注解 自定...
    ting723閱讀 1,498評論 2 5
  • 夯實 Java 基礎 - 注解 不知道大家有沒有一種感覺,當你想要了解某個知識點的時候,就會發現好多技術類 APP...
    醒著的碼者閱讀 1,076評論 4 7
  • Java注解知識梳理—自定義注解處理器 前言 前面介紹了如何自定義注解以及Java中關于注解的一些元素作用,學會了...
    AnonyPer閱讀 3,409評論 1 6
  • 一、概要 注解對于開發人員來講既熟悉又陌生 Java注解又稱為標注,是Java從1.5開始支持加入源碼的特殊語法元...
    wmbp閱讀 363評論 0 0
  • 概述 Java從JDK 5開始支持在源文件中嵌入補充信息,這類信息稱為注解。術語“元數據”也用于表示這種特性,但是...
    平頭哥2015閱讀 560評論 0 0