Android 注解 Annotation
注解:代码中的一个特殊标记,这些标记在代码编译、类加载、运行时被截取到,并执行相应的处理。注解哟永远不会主动运行,只能是被动执行。
应用场景:在开发中,可以在源码中嵌入一些补充的信息,代码分析工具、开发工具和部署工具可以通过这些补充的信息进行验证、处理或者进行部署。
一个标准的注解格式:用@interface表明是一个注解, 它跟interface没有任何关系。注解它只有成员变量没有方法,方法名其实是变量名如value,返回值代表变量类型如String。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindAddress {
String value() default "127.0.0.0";
}
注解变量有设置默认值时,在变量注解时就不需要设置值
@BindAddress //可以不需要设置值
private String address;
@Retention :定义注解的生命周期。有以下几个值
- RetentionPoicy.SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。(适用于检查操作,如我们看到的@Override)
- RetentionPoicy.CLASS:注解会被保留到class文件,它有个默认声明周期,在被java虚拟机加载class文件时被遗弃。(适用于添加一些预处理操纵,如ButterKnife)
- RetentionPoicy.RUNTIM:注解不仅被保留到源文件,被java虚拟机加载class文件时,仍然保留。(适用在运行去动态获取注解信息,长搭配反射配合使用)
@Target: 定义了注解所修饰的对象范围, 它也有个成员变量
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
- ElementType.CONSTRUCTOR:用于描述构造器
- ElementType.FIELD:用于描述域
- ElementType.LOCAL_VARIABLE:用于描述局部变量
- ElementType.METHOD:用于描述方法
- ElementType.PACKAGE:用于描述包
- ElementType.PARAMETER:用于描述参数
- ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
除了@Retention @Target两个,还有@Inherrited:是否允许子类继承父类的注解,默认为false。@Documented是否会保存在JavaDoc文档中。
案例1⃣️:
写一个根据反射获取view Id
开发工具创建一个注解:
给注解添加添加你需要的生命周期和修饰范围。添加一个方法并给予一个默认返回值-1
@Target({
ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface BindView {
int value() default -1;
}
因为注解永远时被动执行,需要通过反射获取注解,再把注解中的值传给findViewById,通过反射把view赋值给代码中TextView对象mText
private void getView() {
//获得成员变量
Field[] fields = getClass().getDeclaredFields