Annotation-元注解

元注解

Java里面定义了4个标准的元注解:

  1. @Target
  2. @Retention
  3. @Documented
  4. @Inherited

这四个元注解的作用是负责注解其他注解,其他所有的注解都是通过元注解扩散开来。

Target

这个元注解的作用是负责指明注解的作用域。如果指明类型为METHOD,说明这个注解只能用在方法上面。
以下是可以指明Target的所有作用类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public enum ElementType {
ANNOTATION_TYPE,
CONSTRUCTOR,
FIELD,
LOCAL_VARIABLE,
METHOD,
PACKAGE,
PARAMETER,
TYPE,
TYPE_PARAMETER,
TYPE_USE;
private ElementType() {
}
}

Retention

这个元注解的作用是对Annotation的作用时间进行限制:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。
以下是可以指明Retention的所有作用类型:

1
2
3
4
5
6
7
8
public enum RetentionPolicy {
CLASS,
RUNTIME,
SOURCE;
private RetentionPolicy() {
}
}

  • RetentionPolicy.SOURCE:在源文件中有效
  • RetentionPolicy.CLASS:在class文件中有效
  • RetentionPolicy.RUNTIME:在运行时有效

Documented

这个元注解的作用是标识是否能够在生成JavaDoc文档是,注解依然保存。这个只是一个标记注解,没有任何成员。
如下:
1.标记有Documented的Annotation与生成的JavaDoc文档

1
2
3
4
5
6
7
8
9
@Target(ElementType.CONSTRUCTOR)
@Inherited
@Documented
@Retention(RetentionPolicy.SOURCE)
public @interface SourceAnnotation {
String name();
String age();
String gender() default "Male";
}

annotation-person-documented
2.没有标记的Annotation与生成的JavaDoc文档

1
2
3
4
5
6
7
8
@Target(ElementType.CONSTRUCTOR)
@Inherited
@Retention(RetentionPolicy.SOURCE)
public @interface SourceAnnotation {
String name();
String age();
String gender() default "Male";
}

annotation-person-not-documented

使用注解的类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Person {
private String name;
@SourceAnnotation(
name="Person",
age="1"
)
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

Inherited

这个元注解的作用是来阐述某个被标注的类型是可以被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。