Android 应用开发中对注解的使用达到了淋漓尽致的地步,无论是运行时注解,还是编译时注解,或是标准注解,都被广泛使用着,Android Support Library甚至专门推出一个注解主持库Support Annotation,各种开源库中也不乏注解的应用。
注解的定义
注解是java语言的特性之一,它是在源代码中插入的标签,这些便签在后面的编译或者运行过程中起到某种作用,每个注解都必须通过注解接口@interface进行声明,接口的方法对应着注解的元素,我们先来看看Android上著名的View注入框架ButterKnife的Bind注解的源码
@interface声明会创建一个实际的java接口,与其他任何接口一样,注解也将会编译成.class文件,注解接口中的元素声明实际上是方法声明,注解接口中的方法没有参数,没有throws语句,也不能使用泛型
标准注解
Java API中默认的注解我们称之为标准注解,它们定义在java.long,java.long.annotation和javax.annotation包中,按照使用场景不同,我们分为如下三类
编译相关注解
编译相关的注解是给编译器使用的,有以下几种
1 @Override :编译器会检查被注解的方法是否真的重载了一个来自父类的方法,如果没有,编译器将会给出错误提示。
2 @Deprecated:可以用来修饰任何不再鼓励使用或者已被弃用的属性和方法等
3 @SuppresWarnings:可用于除了包之外的其他声明项中,用来抑制某种类型的警告
4 @SafeVarargs:用于方法和构造函数,用来断言不定长参数可以安全使用
5 @Generated:一般是给代码生成工具使用,用来表达这段代码不是开发者手动编写的,而是工具生成的,被@Generated修饰的代码一般不建议手动修改它
6 @FuncationalInterface:用来修饰接口,表示对应的接口是带单个方法的函数式接口
资源相关注解
资源相关注解有四个,一般用在Java EE领域,Android应该不会使用到
元注解
元注解,就是用来定义和实现注解的注解,总共有如下五种:
1 @Target:这个注解的取值是一个ElementType类型的数组,用来指定注解所适用的对象范围,总共有十种不同的类型,根据定义的注解进行灵活的组合
同时支持多种类型的注解定义如下:
如果一个注解的定义没有使用@Target修饰,那么它可以用在除了TYPE_USE和TYPE_PARAMEYER之外的其他类型声明中
1 @Retention:用来指明注解的访问范围,也就是在什么级别保留注解,有如下三种选择:
源码级注解:在定义注解接口时,使用@Retention(RetentionPolicy.SOURCE)修饰的注解,该类型的注解信息只会保留在.java源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的.class文件中
编译时注解:在定义注解接口时,使用@Retention(RetentionPolicy.CLASS)修饰的注解,该类型的注解信息会保留在.java源码里和.class文件里,在执行的时候,会被Java虚拟机丢弃,不会加载到虚拟机中
运行时注解:在定义注解接口时,使用@Retention(RetentionPolicy,RUNTIME)修饰的注解,Java虚拟机在运行期也保留注解信息,可以通过反射机制读取注解的信息
2 @Documented :表示被修饰的注解应该被包含在被注解项的文档中
3 @Inherited:表示该注解可以被子类继承的
4 @Repeatable :表示这个注解可以在同一个项上面应用多次,不够这个注解是在Java8中才引入的
网友评论