自定义Annotation学习笔记

JDK元注解

对注解使用的注解又称为元注解

@Retention

Retention意思是保留,声明这个注解的生存时间,包含了一个RetentionPolicy的枚举类的value成员变量。

1
2
3
4
5
6
@Documented//1.3节知识
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)//1.2节知识
public @interface Retention {
RetentionPolicy value();
}
RetentionPolicy枚举 说明
CLASS 将Annotation记录在class文件中,运行时抛弃,这是默认值
RUNTIME 将Annotation记录在class文件中,运行时保留,可以使用反射
SOURCE 只将Annotation记录在java源代码中,用于编译提示报错

@Target

Target意思是目标,表示这个注解可以用于方法Field等不同地方。
可以看到value是一个ElementType枚举类的数组,即可以接收多个参数。

1
2
3
4
5
6
@Documented//1.3节知识
@Retention(RetentionPolicy.RUNTIME)//1.1节知识
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
ElementType枚举 修饰范围
ANNOTATION_TYPE 注解Annotation
PACKAGE
TYPE 类、接口、注释、枚举
CONSTRUCTOR 类构造器
METHOD 方法
FIELD 成员变量
LOCAL_VARIABLE 局部变量
PARAMETER 形式参数

@Documented

Documented意思是文档,修饰的Annotation将被javadoc提取成文档

1
2
3
4
5
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

@Inherited

Inherited意思是遗传,修饰的Annotation所修饰的类将具有继承性。即如果A注解@Inherited修饰,那么被A注解修饰的B类的子类C类将默认被A注解修饰。

1
2
3
4
5
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

自定义Annotation

有了元注解,就可以自定义注解

声明

和普通的类、接口声明一样,使用@interface关键字即可。还可以添加成员变量(以方法的形式),指定默认值。

1
2
3
4
5
6
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation{
String name();
int age() default 20;
}

获取注解信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main {
@MyAnnotation(name = "小明")
public static void main(String[] args) {
Test.test(Main.class);
}
@MyAnnotation(name = "小行", age=12)
public void test1(){
}
}
public class Test {
@MyAnnotation(name="小明", age = 21)
public static void test(Class c){
for(Method m : c.getMethods()){
for(Annotation a : m.getAnnotations()){
if(a instanceof MyAnnotation){
MyAnnotation ma = (MyAnnotation) a;
System.out.println(m.getName()+":"+ma.name()+","+ma.age());
}
}
}
}
}