Annotation注解及元注解

转自:https://blog.51cto.com/weijiancheng/1945266(如侵权请联系删除)
在使用许多第三方框架的时候,查阅源码如ButterKnife等。发现许多注解的使用,顿时觉得注解都玩不溜怎么称霸武林。当然无论Java还是Android的SDK中都有大量注解的使用,以前总是走马观花,印象中知道注解代表的意思,但开口总是说不清道不明,唯有总结方得始终。

注解是附加在代码中的一些信息,可以帮助一些代码分析工具如Lint分析代码,辅助开发者改善代码,对于开发者来说有个提示、警告的作用。但注解不会改变代码逻辑。在此总结了几个Android开发常见的注解的解释,以及对元注解的基本认识。


常见的几个注解

1、@TargetApi

2、@RequiresApi

3、@suppressLint

4、@SuppressWarnings
@TargetApi(Build.VERSION_CODES.M)、@TargetApi(23)

Lint会按照API版本M以上扫描代码,而不是project中指定的minSDKVersion,可以使得高版本Api在低版本SDK上Lint不报错。如果只加这个注解,表明这段代码只能在23及以上的系统上运行,如果你非要在23以下的系统上运行,那该警告的已经警告了,你只是忽略了警告,但运行时该错还是错。

@RequiresApi(api = Build.VERSION_CODES.M)

表示注解目标只能够在指定的版本API及以上运行,消除高版本Api在低版本SDK上的报错,作用上和TargetApi相同,只是在词面上更清楚表达了这是一个建议,而不仅仅是为了消除高版本Api在低版本SDK上的报错。从官方的表述可以看出更推荐使用RequiresApi替换TargetApi。

@SuppressLint("NewApi")

最直接暴力屏蔽指定名称的报错,这里的NewApi对应的具体错误名称是:Calling new methods on older versions。这里的NewApi只是一个缩写名称。相比于@TargetApi指定了版本号,SuppressLint是一律屏蔽,所以一般不建议使用。当然还可以指定任何其他Lint定义好的错误名称。在settings中查找Inspections可以找到预先定义好的所有Error、Warning。对于多个错误,使用逗号隔开。

在XML中类似的做法有:

tools:ignore="ScrollViewCount,UselessParent"忽略XML中的两个警告。
@SuppressWarnings("NumericOverflow")

屏蔽NumericOverflow警告,如:int a = 1 / 0;

一般的语句注解方式suppress for statement 

    @SuppressWarnings("NumericOverflow")

     int a = 10 / 0;

注释注解方式statement for statement with comment

     //noinspection NumericOverflow(以前总是看到这样的注释,但并不知道也是注解)

     int a = 10 / 0;

当然,这些注解可以使用在许多地方如:class、method、statement,分别对应由大到小不同的作用域类、方法、语句,当然作用域范围越大,那么性能损耗自然越大。

Annotation不影响代码逻辑

这些注解的作用只是去除Lint的错误警告,并不能影响任何的代码逻辑。

所以必须在代码中添加相应的兼容性判断代码,如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

      color = getColor(R.color.colorAccent);

}

当然,当你添加完上述兼容代码后,警告也就消失了。

元注解(注解的注解)

常见的元注解:

1、@Documented

2、@Inherited

3、@Retention

4、@Target

分析SuppressLint的定义:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.CLASS)

public @interface SuppressLint {

 value();

}

@Target定义作用目标

其中@Target指定了SuppressLint的作用目标,具体TYPE、FIELD等代表什么,可以在java.lang.annotation.ElementType里面找到。

例如:TYPE表示

/** Class, interface (including annotation type), or enum declaration */

即包含了类、接口(包括注解)、枚举类型。

例如:@Override注解

@Target(ElementType.METHOD)  重写,只能作用于方法

@Retention(RetentionPolicy.SOURCE)  只存在于编码阶段,编译阶段就失效了

public @interface Override {}
@Retention定义保留策略

1、PetentionPolicy.SOURCE 仅保留在源码阶段,编译阶段就失效

2、PetentionPolicy.CLASS默认策略,会保留到编译出字节码阶段,运行时失效

3、PetentionPolicy.RUNTIME 保留到VM的运行时阶段,可通过反射获得



@Documented   注解将被写入javadoc中

@Inherited   子类可以继承父类中的该注解

@Repeatable   找不到例子,有待理解

@Native   尚处于Preview状态,表示常量有可能被本地代码引用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容