0%

annotation

Annotation 可以用来添加额外功能, 减少样板代码.

1. 元注解

目前有 5 种元注解

  1. @Target

指定注解的可用位置, 即注解可以什么地方使用

枚举于 java.lang.annotation.ElementType

  • TYPE 作用于类, 接口或枚举类型
  • FIELD 作用于属性
  • METHOD
  • PARAMETER
  • CONSTRUCTOR
  • LOCAL_VARIABLE 局部变量
  • ANNOTATION_TYPE
  • PACKAGE
  • TYPE_PARAMETER
  • TYPE_USE
  • MODULE
  1. @Retention

指定注解的级别, 即注解将保留多久

枚举于 java.lang.annotation.RetentionPolicy

  • SOURCE
    注解将被编译器抛弃.
    一般用于标记与检查.
    如 @Override, @Deprecated
  • CLASS
    注解在 class 文件中可用, 但会被 VM 抛弃.
    一般用于增强或生成新类.
    通过扩展 AbstractProcessor 实现注解处理器.
  • RUNTIME
    VM 将在运行期也保留注解.
    一遍通过反射机制来读取注解的信息.
  1. @Documented

将此注解包含在 Javadoc 中

  1. @Inherited

允许子类继承父类中的注解

  1. @Repeable

允许注解在同一个声明类型上多次使用

2. 元素

2.1. 元素类型

注解中可以使用的元素类型有:

  • 所有基本类型, 如 int, float, double 等
  • String
  • Class
  • enum
  • Annotation
  • 以上类型的数组

如果使用上述之外的类型, 则编译会报错. 也不允许使用包装类

2.2. 元素值

元素不能有不确定的值.
元素要么有默认值, 要么使用注解时提供元素的值; 无论是使用时声明, 还是默认设定时, 都不能为 null.

3. AbstractProcessor

AbstractProcessor 实现类,
使用 @SupportedAnnotationTypes, 列举支持的注解的全限定类名,
使用 @getSupportedSourceVersion, 标识最低支持的 Java 版本,
AbstractProcessor#process() 是注解处理器的核心方法, 用于处理注解.

在写完注解处理器之后, 需要在 resources/META-INF/services 目录下增加一个 javax.annotation.processing.Processor 文件, 在该文件中写入注解处理器的全限定类名.

也可使用 com.google.auto.serviceauto-service 中的 @AutoService 注解处理元文件.

另外 AbstractProcessor 不好 Debug, 看网上好像要用到 gradle 以及 Android 的 apt 才能实现 Debug. 反正试了一下, 没有成功.