---
注解
---

#### 目录

1. 思维导图
2. 定义
3. 元注解
4. 自定义注解
5. 参考

#### 思维导图

#### 定义

注解是 JDK 5 引入的，注解是代码里的特殊标记，这些标记可以在编译、类加载、运行时被读取，并执行相应的处理。开发人员可以在不改变原有逻辑的情况下，在源文件中嵌入一些补充的信息。

Annotation 不能运行，它只有成员变量，没有方法。Annotation 和 public、final 等修饰符一样，都是程序元素的一部分，Annotation 不能作为一个程序元素使用。

注解将一些本来重复性的工作，变成程序自动完成，简化和自动化该过程。比如用于生产 Java doc、自动代码生成等等。

#### 元注解

元注解可以理解为注解上的注解，有四个：

- @Retention
- @Target
- @Inherited
- @Documented

##### @Retention

定义该 Annotation 被保留的策略。

- RetentionPoicy.SOURCE

  注解只保留在源文件中，当 Java 文件被编译成 class 文件的时候，注解被遗弃。常用于做一些检查性的操作，比如 @Override、@SuppressWarnings  。

- RetentionPoicy.CLASS

  注解被保留在 class 文件，但 JVM 加载 class 文件时被遗弃，这是默认的生命周期。常用于在编译时进行一些预处理，比如生成一些辅助代码，例如 ButterKnife。

- RetentionPoicy.RUNTIME

  注解不仅被保存到 class 文件中，JVM 加载 class 文件之后，仍然存在。常用于在运行时动态获取注解信息，大多会与反射一起使用。

##### @Target

定义了 Annotation 所修饰的对象范围。

- ElementType.CONSTRUCTOR	用于描述构造器
- ElementType.FIELD    用户描述域
- ElementType.LOCAL_VARIABLE   用于描述局部变量
- ElementType.METHOD    用于描述方法
- ElementType.PACKAGE    用于描述包
- ElementType.TYPE    用于描述类、接口或枚举

如果未标注，则表示可修饰所有。

##### @Inherited

是否允许子类继承父类的注解，默认是 false。

##### @Documented

是否会保存到 Javadoc 文档中。

#### 自定义注解



#### 参考

[浅谈Android下的注解](https://juejin.im/post/5b292b736fb9a00e8c4435f7)