Android开发安卓注解Android开发

安卓进阶指南Annotation总结篇(一)

2018-09-14  本文已影响12人  ftc300_carl

前言:为什么要写这篇文章?主要是为了总结一下最近学习内容,记录方便以后查阅。以前有一次面试有人问到看过 ButterKnife 实现的原理是什么?答:注解,反射。然而真的是这样吗?。也在网络上看到很多关于这方面的资料,稂莠不齐,所以趁这阶段有时间特地把 Annotation 搞搞清楚。文中会出现引用一些文章的部分,文末已注明出处,表示感谢。

CkID59daIh.png

代码地址:android-annotation-tutorial

一、为什么需要了解注解

二、什么是注解

An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.

能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据与程序元素进行关联。Annotation 中文常译为“注解”。

三、分类

按照来源划分

类型 说明
来自JDK的注解 java.lang.annotation.* 等
来自Android API的注解 android.annotation.* ,如TargetApi、SuppressLint等
来自第三方的注解 如 support-annotations
自定义注解 N/A

JDK 内置的几个常用注解:

来自 JDK 的注解着重关注一下元注解,也就是第三种分类标准;

在安卓源码中有很多如下代码段,

static {
        if (VERSION.SDK_INT < VERSION_CODES.KITKAT) {
            ROOT_REATTACHED_LISTENER = null;
        } else {
            ROOT_REATTACHED_LISTENER = new OnAttachStateChangeListener() {
                @TargetApi(VERSION_CODES.KITKAT)
                @Override
                public void onViewAttachedToWindow(View v) {
                    // execute the pending bindings.
                    final ViewDataBinding binding = getBinding(v);
                    binding.mRebindRunnable.run();
                    v.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                }
            };
        }
    }

@TargetApi(VERSION_CODES.KITKAT)
如果只加这个注解,表明这段代码只能在19及以上的系统上运行,如果你非要在19以下的系统上运行,那该警告的已经警告了,你只是忽略了警告,但运行时该错还是错;

关于 Android 注解具体介绍请看下一篇文章

按照运行机制划分

类型 说明
源码注解 RetentionPolicy.SOURCE 标记,用于告诉编译器一些信息
编译时注解 RetentionPolicy.CLASS 编译时动态处理,如动态生成代码
运行时注解 RetentionPolicy.RUNTIME 运行时动态处理,如得到注解信息

元注解

元注解的作用就是负责注解其他注解。java 1.5定义了4个meta-annotation类型,
在1.8中又添加了两个,用来提供对Annotation 类型做说明。该注解位于包

java.lang.annotation 下:

元注解 详情
@Target since 1.5 用于描述注解的使用范围
@Retention since 1.5 定义了该Annotation被保留的时间长短
@Document since 1.5 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API
@Inherited since 1.5 阐述了某个被标注的类型是被继承的
@Repeatable since 1.8 N/A
@Native since 1.8 N/A

四、最后

优点
  1. 集中管理对象和对象之间的组合关系,易于阅读
  2. 编译期间容易发现错误的出处
缺点
  1. 运行中的错误很难定位,调试难度较大
  2. 管理分散,基本每个类上都有
何时选择

如果客户需求进行发生变化,那么采用配置文件的方式会好一些 , 有利于扩展。
如果客户需求不会频繁发生变化, 那么使用注解非常好,开发效率快.

最后提醒下:

要用好注解,必须熟悉java 的反射机制,注解的解析完全依赖于反射 , 不要滥用注解。平常我们编程过程很少接触和使用注解,只有做设计,且不想让设计有过多的配置时。

这篇文章中我们并不设计怎么使用注解,主要是能对它有个总体印象 , 后面三篇文章会按照运行机制来进行举例。

参考链接:

上一篇 下一篇

猜你喜欢

热点阅读