Android中注解的使用

安卓开发中会有很多地方使用到注解,有些是Java中的,有些是三方框架所带的。

Java中的常见的几种标准注解

@Override 表示当前的方法定义将覆盖父类中的方法。
@Deprecated 表示废弃的意思,使用了该注解的方法或者对象,则会有提示。
@SuppressWarnings 关闭不当的编译器警告信息

上述几种标准注解我们在安卓开发的过程中经常会看到,不过我们平常使用的注解还有一类并不是Java提供给我们的,而是我们自定义的。自定义注解需要使用到Java提供的几个元注解。元注解是用在注解上的注解。

Java提供给我们的几个元注解

@Documented 表示是否将注解信息添加在java文档中
@Retention 定义该注解的生命周期
@Target 表示该注解用于什么地方
@Inherited 定义该注释和子类的关系

下面着重解释后三个

  1. @Retention

    这个元注解表示他所修饰的注解的生命周期,即需要在什么级别保存该注解信息,
    Retention有一个属性value,是RetentionPolicy类型的,RetentionPolicy是一个枚举
    类型,这个枚举决定了Retention注解应该如何去保持。RetentionPolicy有以下三个值      
    **RetentionPolicy.SOURCE**:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
    **RetentionPolicy.CLASS**:注解被保留到class文件,但jvm加载class文件的时候被遗弃,这是默认的生命周期;
    **RetentionPolicy.RUNTIME**:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
    
  2. @Target
    Target注解说明了他修饰的注解修饰的对象范围,使用的时候类似于
    @Target({ElementType.METHOD})
    ElementType的取值以及含义如下图

    在这里插入图片描述

  3. @Inherited
    在注解上使用@Inherited 表示该注解会被子类继承,注意,仅针对类,成员属性、方法并不受此注释的影响。

自定义注解的例子:其中的@interface含义为声明新的枚举注解类型

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DemoAnnotions{
   
 }

安卓中提供的几个元注解

安卓在19.1版本开始引入了一个新的注解库,也包含一些元注解供我们使用。
比如@IntDef & @StringDef,安卓中用@IntDef & @StringDef来代替枚举的使用。
在日常开发中我们时常会有机会写到枚举,但是枚举是很耗内存的。每一个枚举值都是一个单例对象,在使用它时会增加额外的内存消耗。
看一个@IntDef替代枚举的例子:

@IntDef({DemoType.UGC, DemoType.PGC, DemoType.VIDEO, DemoType.IMAGE_TEXT, DemoType.PLAIN_TEXT})
@Retention(RetentionPolicy.SOURCE)
public @interface DemoType {
    int UGC = 0;
    int PGC = 1;
    int VIDEO = 2;
    int IMAGE_TEXT = 3;
    int PLAIN_TEXT = 4;
}

定义@IntDef有两种方式:

@IntDef({DemoType.UGC, DemoType.PGC, DemoType.VIDEO, DemoType.IMAGE_TEXT, DemoType.PLAIN_TEXT})
@IntDef(flag = true ,value = {DemoType.UGC, DemoType.PGC, DemoType.VIDEO, DemoType.IMAGE_TEXT, DemoType.PLAIN_TEXT})

在安卓中注解肯定不是只有替代枚举这一个作用,事实上我们可以用注解实现非常多的功能。比如我们常用的ButtterKnife中就有很多各种功能的注解。让注解实现一个特定的功能就要说到反射了。

反射

  1. 反射的定义
    Java反射机制是指在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法。对于任何一个对象,都能够调用它的任何一个方法和属性。这样动态获取新的以及动态调用对象方法的功能就叫做反射。

    在Java中的反射机制,被称为Reflection。它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法。Reflection机制允许程序在正在执行的过程中,利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成Instances、变更fields内容或唤起methods。

  2. 安卓中反射作用于注解
    这里我们实现一个小功能来说明反射怎么作用于注解。
    我们首先确定目标,我们实现一个类似于ButterKnife中绑定view的功能,即使用注解代替findViewById的功能。

    第一步先定义注解:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.CLASS)
    public @interface MyBindView {
        int value();
    }
    

    第二步写注解解释器

public void injects(AppCompatActivity activity) {
        Class<? extends AppCompatActivity> clazz = activity.getClass();
        Field[] fields = clazz.getFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
                //判断字段是否标注MyBindView
                MyBindView myBindView = field.getAnnotation(MyBindView.class);
                if (myBindView != null) {
                    //反射访问私有成员,必须加上这句
                    View view = activity.findViewById(myBindView.value());
                    if (view != null) {
                        try {
                            field.setAccessible(true);
                            field.set(activity, view);
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }

                    }
                }
            }
        }
    }

使用的时候如下:

   injects(this);
   @MyBindView(R.id.account_feedback_btn)
    View feedbackBtn;

这样就类似ButterKnife的@bindView功能了。

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

推荐阅读更多精彩内容

  • 前言 Android Support Library 从 19.1 版本开始引入了一个新的注解库,其中包含了很多的...
    Airsaid阅读 4,814评论 1 15
  • 注解是开发中经常使用到的,因为很久前在网上找了几篇文章,发现完全看不懂,所以觉得这个东西好像很难搞,最近耐心的看完...
    Tyhj阅读 13,705评论 0 20
  • 导言 平常开发中经常会使用到ButterKnife、EventBus这些有使用注解的第三方库,直观来看作用就是“明...
    范锦浩阅读 2,887评论 0 5
  • 1.引言从jdk1.5开始,引入了注解类Annotation,Annotation其实是一种接口,可以作用于类、方...
    明明_白_白阅读 755评论 0 1
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和...
    九尾喵的薛定谔阅读 3,139评论 0 2