Android注解基础和自定义

在android的开发中注解使用是非常常见的,注解可以使代码阅读更加的清晰,整洁,可读性大大增强。
注解的原理:
使用interface来用作标记,@Target来用作描述类型(包括类、成员变量、方法等)@Retention来描述生命周期。其内部是通过类的反射机制,调用指定对象的方法,从而达到与对象直接调用方法相同的效果。

一、注解作用

在Java开发中,注解一般有以下功能:

标识

java SE5,在jdk中,类似我们比较常见的注解有Override,Deprecated,SuppressWarnings,这些作用只是作为标识,删除对程序没影响。他们的作用分别为:
Override 表示这个方法重写了父类的方法
Deprecated 表示jdk中不建议使用这个方法或者属性
SuppressWarnings 表示屏蔽了某些警告

java8 新特性:Repeatable 表示允许多次使用同一个注解

运行时处理

这个编译器默认的做法,编译器会通过class文件,逐个逐个的遍历class的属性和方法,即运行时处理。

编译时处理

在运行之前,有学过C的程序猿就会知道,编译器在运行之前,编译的时候会将include进来的*.h文件进行引入。同理例如你在代码中引入注解,编译器会在编译的时候,将注解的属性引入再进行编译。

二、注解基础

先看一个简单自定义注解

@Target(ElementType.TYPE)  //用于描述类
@Retention(RetentionPolicy.RUNTIME)  //运行时注解
public @interface ContentView {
    //注解的值
    int value();
}

这上面记得要添加一个@,不然就变成定义一个接口。在这里,value()不是代表一个方法,而是代表一个属性,其中value是属于整形的属性,默认值为1。
自定义的上面的@Target@Retention就是传说中的元注解,下面看下元注解

元注解 作用
@Target 表示该注解可以用于什么地方,可能在ElementType参数包括:
**CONSTRUCTOR: 用于描述构造器
FIELD: 用于描述域
LOCAL_VARIABLE: 用于描述局部变量
METHOD: 用于描述方法
PACKAGE: 用于描述包
PARAMETER: 用于描述参数
TYPE: **用于描述类、接口(包括注解类型) 或enum声明
@Retention 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE: 注解将被编译器丢弃
CLASS: 注解在class文件中可用,但会被VM丢弃。
RUNTIME: VM将在运行期也保留注解,因此可以通过反射机制读取注解的信息
@Document 将此注解包含在javadoc中
@Inhrited 允许子类继承父类中的注解

java 8新特性:java 8之前注解只能是在声明的地方所使用,比如类,方法,属性;java 8里面,注解可以应用在任何地方,比如方法参数前面等。

三、自定义注解的格式

public @interface 注解名{注解体}。注解体中注解元素可以被public修饰,也可以什么也不写,元素类型可以是:

  1. 所有基本数据类型(int,float,boolean等八种基本类型)
  2. String类型
  3. Class类型
  4. enum类型
  5. Annotation类型(说明注解可以嵌套)
  6. 以上所有类型的数组

默认值的限定

编译器对默认值过分的挑剔,要么有确定的默认值,要么在使用的时候提供元素的值。
基本类型的元素都有默认值,不用写default也可以,但是想String这类就必须要写,而且不能写null,因此在某些需要分清是null还是空字符串的地方要注意。

四、自定义注解

注解声明:

@Target(ElementType.TYPE)  //用于描述类
@Retention(RetentionPolicy.RUNTIME)  //运行时注解
public @interface ContentView {
    //注解的值,默认为1,可不写
    int value() default 1;
}

标记类:

@ContentView(R.layout.activity_main)
public class DemoActivity extends AppCompatActivity {

    @FindView(R.id.btn1)
    private AppCompatButton mBtn1;

    @FindView(R.id.btn2)
    private AppCompatButton mBtn2;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        injectContentView(this);
    }
}

injectContentView(this)负责将值注入:

/**
     * 通过反射将值注入
     *
     * @param activity
     */
    private void injectContentView(Activity activity) {
        //获取activity对应的class
        Class a = activity.getClass();
        //判断当前class是否有ContentView的注解
        if (a.isAnnotationPresent(ContentView.class)) {
            //获取注解实例
            ContentView contentView = (ContentView) a.getAnnotation(ContentView.class);
            //获取注解中的值
            int layoutIt = contentView.value();
            try { //获取class的方法,第一个参数是方法名,第二个是方法参数的类型
                Method method = a.getMethod("setContentView", int.class);
                method.setAccessible(true);
                //调用指定对象的此方法,第二个是方法的参数
                method.invoke(activity, layoutIt);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }

这里就只是简单的介绍了注解!还有好多东西后面慢慢写

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,826评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,728评论 25 708
  • 都说理科生是理智得冷血的,都说摩羯是慢热得理性得。但我恰好是个反例。也许我就是理科生中最感性得那一位,也许我是摩羯...
    米兰得小情调阅读 333评论 0 0
  • 上一期 关于投资思路的一些变化(二)//www.greatytc.com/p/8de4db4cc485 ...
    SylvaChen阅读 915评论 0 1
  • 人总是在生病的时候会有很多感慨,不管是感冒,还是癌症,一些想法总是不由自主的从脑子里跑出来。从小都幻想着自己是一个...
    zmoon阅读 257评论 0 0