Android注解分类

注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。

本篇文章内容来自于
Android高级进阶 顾浩鑫

前言

应用:

  • Android Support Library推出一个注解支持库Support Annotation
  • REST网络请求函数库Retrofit使用运行时注解
  • 依赖注入函数库Dagger2使用编译时注解

目录

  1. 什么是注解
  2. 注解分类
    --2.1 标准注解(Java API中默认定义的注解)
    ----2.1.1 编译相关注解(编译相关的注解是给编译器使用的)
    ----2.1.2 资源相关注解(可无视)
    ----2.1.3 元注解(用来定义和实现注解的注解)
    --2.2 运行时注解(配合反射使用)
    --2.3 编译时注解【待补】

1. 什么是注解

注解是在源代码中插入的标签,这些标签在后面的编译或者运行中起到某种作用。

每个注解必须通过注解接口@interface进行声明,接口的方法对应着注解的元素。

2. 注解分类

2.1 标准注解

Java API中默认定义的注解称为标准注解,它们定义在java.lang、java.lang.annotation、java.annotation中。

根据使用场景不同,可分为

  • 编译相关注解
  • 资源相关注解
  • 元注解

2.1.1 编译相关注解

编译相关的注解是给编译器使用的。

@Override:编译器会检查被注解的方法是否真的重载了一个来自父类的方法、如果没有,编译器将会给出错误提示。
@Deprecated:可以用来修饰任何不再鼓励使用或已被弃用的属性、方法等。
@SuppressWarnings:可用于除了包之外的其他声明项中,用来抑制某种类型的警告。
@SafeVarargs:用于方法和构造函数,用来断言不定长参数可以安全使用。
@Generated:一般是给代码生成工具使用,用来表示这段代码不是开发者手动编写的,而是工具生成的。被@Generated修饰的代码一般不建议手动修改它。
@FunctionalInterface:用来修饰接口,表示对应的接口是带单个方法的函数式接口。

2.1.2 资源相关注解

资源相关的注解有四个,一般用在JavaEE领域,Android开发中应该不会用到。

@PostConstruct:用在控制对象生命周期的环境中,例如Web容器和应用服务器,表示在构造函数之后应该立即调用被该注解修饰的方法。
@PreDestory:表示在删除一个被注入的对象之前应该立即调用被该注解修饰的方法。
@Resource:用于Web容器的资源注入,表示单个资源。
@Resources:用于Web容器的资源注入,表示一个资源数组。

2.1.3 元注解

元注解,就是用来定义和实现注解的注解。
总共有五种。

1⃣️@Target 用来指定注解所适用的对象范围
如果一个注解的定义没有使用@Target修饰,那么它可以用在除了TYPE_USE和TYPE_PARAMEYER之外的其他类型中。

@Target参数取值

//注解参数取值是一个ElementType类型的数组。
元素类型    适用于
ANNOTATION_TYPE 注解类型声明
CONSTRUCTOR 构造函数
FIELD   实例变量
LOCAL_VARIABLE  局部变量
METHOD  方法
PACKAGE 包
PARAMETER   方法参数或者构造函数的参数
TYPE    类(包含enmu)和接口(包含注解类型)
TYPE_PARAMETER  类型参数
TYPE_USER   类型的用图

使用案例

@Target({ElementType.TYPE,ElementType.PACKAGE})
public @interface CrashReport

2⃣️@Retention:用来指明注解的访问范围
也就是在什么级别保留注解
未指定类型时,默认是CLASS类型。

参数取值

源码级注解:
在定义注解接口时,使用@Retention(RetentionPolicy.SOURCE)修饰的注解,
该类型的注解信息只会保留在.java源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的.class文件中。

编译时注解:
在定义注解接口时,使用@Retention(RetentionPolicy.CLASS)修饰的注解,
该注解的注册信息会保留在.java源码里和.class文件里,在执行的时候,会被Java虚拟机丢弃,不会加载到虚拟机种。

运行时注解:
在定义注解接口时,使用@Retention(RetentionPolicy.RUNTIME)修饰的注解,
Java虚拟机在运行期也保留注解信息,可以通过反射机制读取注解的信息(.java源码,.class文件和执行的时候都有注解的信息)

3⃣️@Documented:表示被修饰的注解应该被包含在被注解项的文档中。
例如用JavaDoc生成的文档

4⃣️@Inherited:表示该注解可以被子类继承的。

5⃣️@Repeatable:表示这个注解可以在同一个项上面应用多次
不过这个注解是在Java8中才引入的,前面四个元注解都是在Java5中就已经引入的。

2.2 运行时注解

定义运行时注解,只需要在声明注解时指定@Retention(RetentionPolicy.RUNTIME)即可。

运行时注解一般和反射机制配合使用,相比编译时注解性能比较低,但灵活性好,实现起来比较简答。

2.3 编译时注解

编译时注解能够自动处理Java源文件并生成更多的源码、配置文件、脚本或其他可能想要生成的东西。
这些操作是通过注解处理器完成的。

Java编译器集成了注解处理、通过在编译期间调用javac -processor命令可以调起注解处理器,它能够允许我们实现编译时注解的功能,从而提高函数库的性能。

你可能感兴趣的:(Android注解分类)