安卓注解Android Annotation

注解主要有以下幾個來源:

  • Java中的注解:
    1. 元注解 位于java.lang.annotation包中 @Documented @Inherited @Repeatable @Retention @Target
    2. 普通注解位于java.lang包中 @Override@Deprecated @FunctionalInterface(1.8后) @SuppressWarnings
  • Android 原生注解:
    位于android.annotation包中 @TargetApi @SuppressLint
  • Android Support中的注解 :

    位于android.support.annotation包中疲迂。@Nullable @NonNull @CheckResult @ColorRes(資源引用) @Size @IntRange(范圍) @MainThread(線程) @Keep(Proguard) @RequiresPermission @RequiresApiss
    通過appcompat-v7依賴間接引入 (compile 'com.android.support:appcompat-v7:XXX')
    直接引入(compile ‘com.android.support:support-annotations:XXX’)

  • AndroidAnnotations注解

    位于org.androidannotations.annotations包中尝蠕。
    包引入:compile "org.androidannotations:androidannotations-api: $AAVersion"

    注解處理器引入:annotationProcessor "org.androidannotations:androidannotations:$AAVersion"

  • 自定義注解

環(huán)境配置

Android Support配置

在build.gradle中加入依賴:

dependencies {
    compile 'com.android.support:support-annotations:XXX'
}

如果依賴中有appcompat-v7空繁,該包默認(rèn)依賴support-annotations舔琅,不用再配置


image.png

support-annotations包中的內(nèi)容如下:


image.png
AndroidAnnotation配置
def AAVersion = 'XXX'
dependencies {
    annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"
}

androidannotations包中的內(nèi)容如下:


image.png

官網(wǎng):http://androidannotations.org/

AndroidAnnotation Features(AA特性)

  • Dependency injection(依賴注入 ): inject views, extras, system services, resources, ...
  • Simplified threading model(簡化了線程操作): annotate your methods so that they execute on the UI thread or on a background thread.
  • Event binding(事件綁定): annotate methods to handle events on views, no more ugly anonymous listener classes!
  • REST client(REST支持): create a client interface, AndroidAnnotations generates the implementation.
  • No magic(AA不是魔法,只是生成了"SampleActivity_"的子類): As AndroidAnnotations generate subclasses at compile time, you can check the code to see how it works.
  • 體積小捏悬,無反射佩脊, 無運(yùn)行時影響,所以性能也不會受到影響 AndroidAnnotations provide those good things and even more for less than 150kb, without any runtime perf impact!

用法:

關(guān)于Android Support注解常用的用法參考:
AndroidAnnotations框架詳解
關(guān)于AndroidAnnotation注解常用用法參考:
List of all available annotations

自定義Annotation插件

參考Creating an AndroidAnnotations plugin

  1. 創(chuàng)建兩個Java Model,名字可以隨便起
image.png
  • annotationtostring-api:包含自定義的注解@ToString
apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
  • annotationtostring:定義注解處理器随闽,及生成代碼Api父丰,需要依賴annotationtostring-api Model,及org.androidannotations:androidannotations
apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':annotationtostring-api')
    compile 'org.androidannotations:androidannotations:4.4.0'
    compile 'com.helger:jcodemodel:3.0.1'//用于生成 Java 代碼的 Java 庫
}
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
  1. 確定一個唯一的名稱:例如ToString
  2. annotationtostring-api中創(chuàng)建文件 tostring-api.properties,內(nèi)容如下:
version=1.0
  1. annotationtostring中創(chuàng)建文件 tostring.properties,內(nèi)容如下:
version=1.0
  1. annotationtostring-api中創(chuàng)建Annotation
@Retention(RetentionPolicy.CLASS) // required
@Target(ElementType.TYPE) // this can vary per annotation
public @interface ToString {
}
  1. annotationtostring中創(chuàng)建META-INF/services/org.androidannotations.plugin.AndroidAnnotationsPlugin文件,內(nèi)容為:
com.example.ToStringPlugin
image.png
  1. annotationtostring中創(chuàng)建注解處理器
    插件的接入類掘宪,繼承自AndroidAnnotationsPlugin
public class ToStringPlugin extends AndroidAnnotationsPlugin {
    @Override
    public String getName() {
        return "ToString"; 
    }
    @Override
    public List<AnnotationHandler<?>> getHandlers(AndroidAnnotationsEnvironment androidAnnotationEnv) {
        List<AnnotationHandler<?>> handlers = new ArrayList<>();
        handlers.add(new ToStringHandler(androidAnnotationEnv));
        return handlers;
    }
}

創(chuàng)建真正的處理類蛾扇,該類會處理并驗證注解

public class ToStringHandler extends BaseAnnotationHandler<EComponentHolder> {
    public ToStringHandler(AndroidAnnotationsEnvironment environment) {
        super(ToString.class, environment); // this handles your @ToString annotation
    }

    @Override
    protected void validate(Element element, ElementValidation validation) {
        validatorHelper.enclosingElementHasEnhancedComponentAnnotation(element, validation);//該注解只能用在以@E注解開頭的加強(qiáng)類中,但MainActivity中即使添加了@EActivity注解魏滚,最后還是報以下編譯錯誤镀首,注掉不驗證便可。
    }

    @Override
    public void process(Element element, EComponentHolder holder) throws Exception {
        JMethod toString = holder.getGeneratedClass().method(JMod.PUBLIC, getClasses().STRING, "toString");
        toString.body()._return(JExpr.lit("Hello, AndroidAnnotations!"));
        toString.annotate(Override.class);
    }
}
錯誤:
com.example.note.ToString can only be used in a package annotated with 
@interface org.androidannotations.annotations.EApplication, 
@interface org.androidannotations.annotations.EActivity, 
@interface org.androidannotations.annotations.EViewGroup,
@interface org.androidannotations.annotations.EView,
@interface org.androidannotations.annotations.EBean, 
@interface org.androidannotations.annotations.EService, 
@interface org.androidannotations.annotations.EIntentService, 
@interface org.androidannotations.annotations.EReceiver, 
@interface org.androidannotations.annotations.EProvider, 
@interface org.androidannotations.annotations.EFragment.

警告: 
Element com.minicup.annotation.MainActivity invalidated by ToStringHandler
  1. Build 后生成 MainActivity_
@EActivity(R.layout.activity_main)
@ToString
public class MainActivity extends AppCompatActivity {
}
public final class MainActivity_ extends MainActivity implements HasViews{
 @Override
    public String toString() {
        return "Hello, AndroidAnnotations!";
    }
}

參考:

AndroidAnnotations框架詳解
Android注解(Annotation)知識點(diǎn)總結(jié)整理
官網(wǎng)
Android注解AndroidAnnotation的使用及實現(xiàn)流程分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼠次,一起剝皮案震驚了整個濱河市更哄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腥寇,老刑警劉巖竖瘾,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異花颗,居然都是意外死亡捕传,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門扩劝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庸论,“玉大人,你說我怎么就攤上這事棒呛∧羰荆” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵簇秒,是天一觀的道長鱼喉。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么扛禽? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任锋边,我火速辦了婚禮,結(jié)果婚禮上编曼,老公的妹妹穿的比我還像新娘豆巨。我一直安慰自己,他們只是感情好掐场,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布往扔。 她就那樣靜靜地躺著,像睡著了一般熊户。 火紅的嫁衣襯著肌膚如雪萍膛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天嚷堡,我揣著相機(jī)與錄音蝗罗,去河邊找鬼。 笑死麦到,一個胖子當(dāng)著我的面吹牛绿饵,可吹牛的內(nèi)容都是我干的欠肾。 我是一名探鬼主播瓶颠,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刺桃!你這毒婦竟也來了粹淋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤瑟慈,失蹤者是張志新(化名)和其女友劉穎桃移,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葛碧,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡借杰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了进泼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔗衡。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乳绕,靈堂內(nèi)的尸體忽然破棺而出绞惦,到底是詐尸還是另有隱情,我是刑警寧澤洋措,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布济蝉,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏王滤。R本人自食惡果不足惜贺嫂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淑仆。 院中可真熱鬧涝婉,春花似錦、人聲如沸蔗怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寞射。三九已至渔工,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桥温,已是汗流浹背引矩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侵浸,地道東北人旺韭。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像掏觉,于是被迫代替她去往敵國和親区端。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理澳腹,服務(wù)發(fā)現(xiàn)织盼,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 美酱塔, 是一種視覺和精神上的享受沥邻! 喜歡一切美的事物! 用心去感知一切的美好羊娃, 外在才有能力去創(chuàng)造美好的一切唐全! 閨蜜...
    碩和媽媽閱讀 155評論 0 0
  • 2016/12/21 如果是在學(xué)校以外的地方,停電似乎是一件不怎么討喜的事蕊玷,但如果這事發(fā)生在學(xué)校邮利,結(jié)果就完全不同啦...
    dcff157091c5閱讀 225評論 0 0
  • 小小的一只蝴蝶 大概三個小時才畫完 昨天女兒上畫畫課 一上就是一個半小時 我就在下面的教室里 開始畫蝴蝶 等她下課...
    沉默島主閱讀 1,489評論 8 36