序言
注解分为两种,一种是元注解,即java自带的注解,所有的自定义注解都是通过元注解进行自定义的,一种是已定义注解,即在元注解的基础上定义符合业务的注解。
java中使用的注解也比较多,比如@Override使用来覆盖父类的方法,@IdRes是通过ID来查找资源文件的等等
注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明 。注解不会改变编译器的编译方式,也不会改变虚拟机指令执行的顺序,它更可以理解为是一种特殊的注释,本身不会起到任何作用,需要工具方法或者编译器本身读取注解的内容继而控制进行某种操作!
元注解
元注解是java让我们进行自定义注解时使用到的一个工具注解,一般有五种,并且注解需要在JDK1.5版本或1.5版本之后才能使用
@Inherited
@Inherited:代表这个注解可以被继承,注解的继承和类的继承一样,继承之后,子类注解也会有父类定义的注解
不定义该注解时,默认为不可继承
@Documented
@Documented:用来标识注解应该被包含注解项的文档里
不定义改注解时,默认为false
@Target
ElementType.ANNOTATION_TYPE | 可以给一个注解进行注解 |
ElementType.CONSTRUCTOR | 可以给构造方法进行注解 |
ElementType.FIELD | 可以给属性进行注解 |
ElementType.LOCAL_VARIABLE | 可以给局部变量进行注解 |
ElementType.METHOD | 可以给方法进行注解 |
ElementType.PACKAGE | 可以给一个包进行注解 |
ElementType.PARAMETER | 可以给一个方法内的参数进行注解 |
ElementType.TYPE | 可以给一个类型进行注解,比如类、接口、枚举 |
@Retention
RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们
@Retention属性决定着该注解的生命周期
- 标识符,只用来标识源码,对源码进行编译时,注解将会被丢弃,不起任何作用
- 编译时,当源码被编译时,需要对使用了注解的地方通过生成一段新的源码,即生成一个新的类,当编译时,改注解也将不起作用,如butterKnife,Dagger等框架
- 运行时,在编译前后,注解将一直存在,可以通过反射来拿到注解的值并进行一系列操作,如Retrofit框架,直接通过注解的方式进行配置
@Repeatable
@Repeatable是java1.8引入的新特性,版本如果不支持的话可以强制升级为1.8
即在build.gradle文件的android中添加如下代码
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
@Repeatable是用来修饰注解可以取多个值,我们通过一个例子来解释
public @Interface Rxjava {
Person[] value();
}
@Repeatable(Persons.class)
public @Interface Person {
String role() default ""
}
@Person("artist")
@Person("developer")
@Person("superman")
public class Me {}
@Person被@Repeatable修饰,所以Person可以多次作用在同一个对象Me上,而Repeatable接收一个参数,这个参数是个容器注解,用来存放多个@Person
自定义注解
注解时通过@interface来定义的,注解的语法格式如下
@Inherited
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GET {
String value() default "";
}
- 通过@interface来定义注解
- 注解里面可以定义多个属性
- 属性可以设置返回值,但不能带有参数,返回值:数据的基本类型、String、
- 可以default设置一个默认值,当传入参数为空时将使用默认值
- 注解可以使用多个元注解,但每一个元注解只能选择一个参数,一个元注解多个参数是非法的!
结语
这一节我们只是学习注解的基本类型和格式,学习只有先理解才能够慢慢学会,下一节我们将会学习注解的使用实例,通过实例来理解注解的神奇之处!