深入了解注解及其使用
注解是什么
注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。
1、什么是元注解
用于对注解类型进行注解的注解类,称之为元注解。JDK1.5中提供了4个标准元注解。
@Target: 描述注解的使用范围,说明被它所注解的注解类可修饰的对象范围
@Retention: 描述注解保留的时期,被描述的注解在它所修饰的类中可保留到何时
@Documented: 描述在使用Javadoc工具为类生成帮助文档时是否要保留其注解信息
@Inherited: 使被它修饰的注解修饰的注解类的子类能继承到注解
2、元注解@Target的取值及其含义
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface Event {
}
@Target描述的是注解的使用范围,携带的值为枚举,作用是标明它修饰的注解可以用在哪些地方。比如上述例子中的@Event只能作用于属性和方法上
ElementType的取值和意义如下:
public enum ElementType {
//作用在类上
TYPE,
//作用在属性上
FIELD,
//作用在方法上
METHOD,
//作用在参数上
PARAMETER,
//作用在构造器上
CONSTRUCTOR,
//作用在局部变量上
LOCAL_VARIABLE,
//作用在注解上
ANNOTATION_TYPE,
//作用在包名上
PACKAGE,
private ElementType(){...}
}
注意:每个注解可以跟n个ElementType关联。当无指定时,注解可用于任何地方。
3、元注解@Retention的取值及其含义
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {
}
@Retention描述的是注解的存在时期。如上述例子中@Event为运行时注解,在源码,字节码及运行时皆存在
RetentionPolicy取值和意义如下:
public enum RetentionPolicy {
//源码时注解, 只在源码中存在,编译后便不存在了
SOURCE,
//编译时注解,源码和编译时存在,运行时不存在
CLASS,
//运行时注解,源码,编译时,运行时都存在
RUNTIME;
private RetentionPolicy(){...}
}
注意:每个注解只能和一个RetentionPolicy关联。当无指定时,默认为RetentionPolicy.CLASS
4、其他元注解介绍
@Documented: 类和方法的Annotation在缺省情况下是不出现在javadoc中的。如果使用@Documented修饰该注解,则表示它可以出现在javadoc中。
@Inheried: 当使用该注解的类有子类时,注解在子类仍然存在。通过反射其子类可获得父类相同的注解
5、自定义注解的参数
public @interface Person {
public String name();
//默认值
int age() default 18;
int[] array();
}
注解能够携带的参数类型有:基本数据类型,String, Class, Annotation, enum
注解的使用
注解目前比较常见的使用场景有
a、编译时动态检查,比如某参数的取值只能为某些int值,如颜色。则可以使用编译时注解在编译时对参数进行检查
b、编译时动态生成代码,使用注解处理器在编译时生成class文件。如ButterKnife实现
c、运行时动态注入,用注解实现IOC,许多框架将原有配置文件xml改成注解用的便是IOC注入。
1、编译时注解-Apt注解处理器使用
下面以实际案例讲解。案例目标:
实现注解绑定控件,效果如下
public class MainActivity extends AppCompatActivity {
@BindView(R.id.tv)
public TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);