Java注解与Android

什么是注解?
在代码中添加信息的一种形式化方法,以便在稍后的某个时刻非常方便的使用这些数据。

一、设计初衷

1. 简述

  • 回应C#(特性Atrribute)之类的其他语言对java造成的语言特性的压制。这里有人编了一个故事。

  • 把元数据与源代码结合在一起

2. 什么叫“把元数据与源代码结合在一起”?**

  1. javaBean属性添加数据库字段描述


    Java注解与Android_第1张图片
    使用nutz配置数据与bean类的映射关系
  2. 服务器接口方法添加web配置描述


    Java注解与Android_第2张图片
    使用nutz配置服务器登录接口
  3. 为注释提供源代码的链接

  4. 为方法添加编译器检测描述


    Java注解与Android_第3张图片
    为注解提供源代码链接、添加AS检测描述图例

二、定义注解

1. 注解的结构及名词定义

注解在代码中的定义的样子如图:


Java注解与Android_第4张图片
注解的样子

2. 元注解

定义:专职注解其他注解的注解

元注解枚举及说明:

Java注解与Android_第5张图片
网上扒的图

3. 注解的语法

  1. 注解也会编译成class文件
  2. 使用元注解来定义注解
  3. 注解的元素必须有默认值
  4. 对于非基本类型的元素,默认值不能为null
  5. 注解不支持继承
  6. 注解支持嵌套
  7. 注解元素限制可用类型

注解元素可用的类型:

  • 所有基本类型(int、float、boolean等)
  • String
  • Class
  • Annotation
  • 以上类型的数组

三、注解处理器

注:这里的注解处理器不是annotationProcessor(见第四部分

这是一个代码结构上的概念。任何注解需要产生意义都需要注解处理器的帮忙,一个定义后的注解在使用时运行的逻辑都写在注解处理器中。

注解处理器根据@Retension的不同有如下几种出现的情况:

1. Source
此时的注解处理器一般由编辑器(如Android Studio)提供,负责检查使用上的错误,如: @Override、@IntDef等
2. Class
此时的注解必须使用注解处理工具apt构建(见第四部分),一般会出现新的java文件,如: butterknife的@OnClick、@BindView等
3. Runtime
此时的注解处理器一般使用反射处理注解,它在运行时依然可以被检查到。它出现的位置可能在代码中,也可能在程序外部,如:@Deprecated、单元测试的@Test

四、编译时注解的编译流程

编译时注解:泛指 @RetensionClass 的注解

1. 注解处理工具apt

用来处理、编译注解处理器的工具,目前安卓中常用的几种apt如下:

    • java1.5-java1.7版本tool.jar中的com.sun.mirror.*包
    • google内置框架中的annotationProcessor
    • gradle插件android-apt

2. 注解处理工具apt的编译流程

apt负责编译注解处理器,并检测并编译新生成的java文件,反复编译至不再产生新文件,与所有class文件共同编译。如图:

Java注解与Android_第6张图片
注解编译过程.jpg

五、在Android中的使用

除了java中提供的一些注解,android.support.annotation包也提供了大量的注解,以帮助我们Android开发者享受到注解的好处。

1. 规定方法参数,避免错误参数的使用

举个例子如下图:

Java注解与Android_第7张图片
注解使用举例

代码中定义了注解@Orientation,用这个注解修饰方法参数,当使用时传入了错误的参数,Android Studio就会报错:

使用注解后,AS报错图例

2. 代替枚举

如上,我们可以从中得到另外一个启发,代替枚举(在Android系统中使用枚举的开销是使用常量的2倍)。当我们在switch中使用@IntDef这类注解时,可以发现Android Studio对这类注解提供了自动添加case代码的功能:

Java注解与Android_第8张图片
switch配合@IntDef的使用

3. 一般的第三方数据会使用注解进行bean与表的映射配置

4. 在IOC、AOP等编程方式中经常用到注解,如我们常用的库butterknife中。

你可能感兴趣的:(Java注解与Android)