Java从1.5引入了注解(Annotation),使得Java具有动态语言
的特性。
Java中常用的注解有:
- @Override
- @Deprecated
- @SuppressWarnings
元注解
用来修饰注解的注解
- @Documented
- @Retention
- @Target
- @Inherited
@Documented
用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。
@Retention
- SOURCE:源文件保留,在编译器进行编译时它将被丢弃忽视;
- CLASS:class保留,并不会被加载到 JVM 中;
- RUNTIME:运行时保留;
@Target
- CONSTRUCTOR:构造器;
- FIELD:实例;
- LOCAL_VARIABLE:局部变量;
- METHOD:方法;
- PACKAGE:包;
- PARAMETER:参数;
- TYPE:类、接口(包括注解类型) 或enum声明。
@Inherited
用于描述某个被标注的类型是可被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
自定义注解注意事项
1 | package com.shjlone.anno; |
注解属性的返回值类型必须是以下几种:
- 基本数据类型
- String类型
- 枚举类型
- 注解
- 以上类型的数组
如果返回值没有默认值,则在使用注解时必须显示设置
APT
APT 即为 Annotation Processing Tool,它是 javac 的一个工具,中文意思为编译 时注解处理器。APT 可以用来在编译时扫描和处理注解。
获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能。APT 的核心是 AbstractProcessor 类。
RoundEnvironment
processingOver
如果当前轮次不是最后一轮,则processingOver()返回false,否则返回true。
getElementsAnnotatedWith
返回值是一个Element类型的Set集合,入参有两种类型,一种是Class类型,这里就是自定义的某种注解类型,一种是TypeElement类型,
TypeElement位于javax.lang.model.element包下,是Element的子类型,代表了一种类或者接口类型。
ProcessingEnvironment
ProcessingEnvironment相当于一个工具类集合,它可以通过该工具类进行写入文件、打印日志以及查找其它元素类型。