android之注解基础

来源:互联网 发布:csgo n卡优化 编辑:程序博客网 时间:2024/05/16 19:11

注解现在很受青睐,在一些流行开源项目中,都被广泛使用着,如依赖注入函数库Dagger2使用编译时注解,View注入框架ButterKnife使用编译时注解,网络请求函数库Retrofit使用运行时注解等。同时Android Support Library中也有专门的注解支持库Support Annotation.

1.注解基本介绍

注解(Annotation)也被称为元数据(Metadata),是在Java SE 5中提供的一个新特性。Annotation可以用来修饰类,属性,方法。除了使用系统内置的Annotation以外,用户还能够通过自定义Annotation来实现所需要的功能。
一些我们经常能见到注解:

  • @Override:编译器会检查被注解的方法是否真的重载了一个来自父类的方法,如果没有,编译器会给出错误提示。
  • @Deprecated:可以用来标识一些过时的、被弃用的属性或方法。
  • @SuppressWarnings:可用于除了包之外的其他声明中,用来抑制某种类型的警告。
  • @SafeVarargs:用于方法和构造函数,用来指定不定长参数可以安全使用
  • @Generated:代码生成工具使用,用来标识代码不是开发者写的,是由工具自动生成的。被其修饰的代码最好不要尝试修改。
  • @FunctionalInterface:用来修饰接口,表明该接口为只有单个方法的函数式接口。
    以上都是编译相关的注解,给编译器使用的。

2.元注解

用来定义和实现注解的注解,自定义注解也是通过其来实现的,元注解有以下五种。

  • @Target:表示Annotation可以用在什么地方,这个注解的取值是一个ElementType类型的数组,用来指定注解所适用的范围,共有十种不同的类型,可根据需求自由灵活组合使用。
元素类型 适用说明 TYPE 类、接口(包含注解类型)或者是enum声明 ANNOTATION_TYPE 注解类型声明 FIELD 实例变量(包含enum声明) LOCAL_VARIABLE 局部变量 METHOD 方法 PACKAGE 包 CONSTRUCTOR 构造函数 PARAMETER 方法参数或者构造函数的参数 TYPE_PARAMETER 类型参数 TYPE_USE 类型用途

当然支持多种类型的注解定义,如:

@Documented@Retention(CLASS)@Target({METHOD, PARAMETER, FIELD, ANNOTATION_TYPE, PACKAGE})public @interface NonNull {}

如果一个注解的定义没有使用@Target修饰,那么它可以使用在除了TYPE_USE和TYPE_PARAMETER之外的其他类型声明中。

  • @Retention:用来说明注解的访问范围,表示在什么级别保存该注解信息,RetentionPolicy的取值有如下三种:
    • 源码级注解:在定义注解时,使用@Retention(RetentionPolicy.SOURCE)修饰的注解,该类型的注解信息会保留在.java源码里,经过编译后被丢弃,不会保存在编译好的.class文件里。
    • 编译时注解:在定义注解时,使用@Retention(RetentionPolicy.CLASS)修饰的注解,该类型的注解信息会保留在.java源码和.class文件里,代码执行时,不会加载到JVM中,会被其丢弃的。
    • 运行时注解:在定义注解时,使用@Retention(RetentionPolicy.RUNTIME)修饰的注解,JVM在运行期间也保留注解信息,可以通过反射机制读取注解的信息(.java源码、.class文件和执行的时候都有注解信息)。
  • @Documented:表示被修饰的注解应该被包含在该注解的文档中(表示在javadocs中包含这个注解)
  • @Inherited:表示允许子类继承父类中的注解
  • @Repeatable:表示这个注解可以在同一项上多次使用(这个是在java8中引入的)