什么是注解?
在代码中添加信息的一种形式化方法,以便在稍后的某个时刻非常方便的使用这些数据。
一、设计初衷
1. 简述
-
回应C#(特性Atrribute)之类的其他语言对java造成的语言特性的压制。这里有人编了一个故事。
-
把元数据与源代码结合在一起
2. 什么叫“把元数据与源代码结合在一起”?**
-
javaBean属性添加数据库字段描述
使用nutz配置数据与bean类的映射关系 -
服务器接口方法添加web配置描述
使用nutz配置服务器登录接口 -
为注释提供源代码的链接
-
为方法添加编译器检测描述
为注解提供源代码链接、添加AS检测描述图例
二、定义注解
1. 注解的结构及名词定义
注解在代码中的定义的样子如图:
注解的样子
2. 元注解
定义:专职注解其他注解的注解
元注解枚举及说明:
网上扒的图3. 注解的语法
- 注解也会编译成class文件
- 使用元注解来定义注解
- 注解的元素必须有默认值
- 对于非基本类型的元素,默认值不能为null
- 注解不支持继承
- 注解支持嵌套
- 注解元素限制可用类型
注解元素可用的类型:
- 所有基本类型(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
四、编译时注解的编译流程
编译时注解:泛指 @Retension 为 Class 的注解
1. 注解处理工具apt
用来处理、编译注解处理器的工具,目前安卓中常用的几种apt如下:
- java1.5-java1.7版本tool.jar中的com.sun.mirror.*包
- google内置框架中的annotationProcessor
- gradle插件android-apt
2. 注解处理工具apt的编译流程
apt负责编译注解处理器,并检测并编译新生成的java文件,反复编译至不再产生新文件,与所有class文件共同编译。如图:
注解编译过程.jpg五、在Android中的使用
除了java中提供的一些注解,android.support.annotation包也提供了大量的注解,以帮助我们Android开发者享受到注解的好处。
1. 规定方法参数,避免错误参数的使用
举个例子如下图:
注解使用举例代码中定义了注解@Orientation,用这个注解修饰方法参数,当使用时传入了错误的参数,Android Studio就会报错:
使用注解后,AS报错图例2. 代替枚举
如上,我们可以从中得到另外一个启发,代替枚举(在Android系统中使用枚举的开销是使用常量的2倍)。当我们在switch中使用@IntDef这类注解时,可以发现Android Studio对这类注解提供了自动添加case代码的功能:
switch配合@IntDef的使用
网友评论