注解

Catalogue   

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.shjlone.anno;

enum Lamp {
RED, GREEN, YELLOW
}

public @interface MyAnno {
//基本数据类型
int num() default 1;
//String类型
String value();
//枚举类型
Lamp lamp();
//注解类型
MyAnno2 myAnno2();
//以上类型的数组
String[] values();
Lamp[] lamps();
MyAnno2[] myAnno2s();
int[] nums();
}

注解属性的返回值类型必须是以下几种:

  • 基本数据类型
  • 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相当于一个工具类集合,它可以通过该工具类进行写入文件、打印日志以及查找其它元素类型。

参考