Annotation 可以用来添加额外功能, 减少样板代码.
1. 元注解
目前有 5 种元注解
- @Target
指定注解的可用位置, 即注解可以什么地方使用
枚举于 java.lang.annotation.ElementType
- TYPE 作用于类, 接口或枚举类型
- FIELD 作用于属性
- METHOD
- PARAMETER
- CONSTRUCTOR
- LOCAL_VARIABLE 局部变量
- ANNOTATION_TYPE
- PACKAGE
- TYPE_PARAMETER
- TYPE_USE
- MODULE
- @Retention
指定注解的级别, 即注解将保留多久
枚举于 java.lang.annotation.RetentionPolicy
- SOURCE
注解将被编译器抛弃.
一般用于标记与检查.
如 @Override, @Deprecated - CLASS
注解在 class 文件中可用, 但会被 VM 抛弃.
一般用于增强或生成新类.
通过扩展 AbstractProcessor 实现注解处理器. - RUNTIME
VM 将在运行期也保留注解.
一遍通过反射机制来读取注解的信息.
- @Documented
将此注解包含在 Javadoc 中
- @Inherited
允许子类继承父类中的注解
- @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.service 的 auto-service 中的 @AutoService 注解处理元文件.
另外 AbstractProcessor 不好 Debug, 看网上好像要用到 gradle 以及 Android 的 apt 才能实现 Debug. 反正试了一下, 没有成功.