JDK元注解
对注解使用的注解又称为元注解。
@Retention
Retention
意思是保留,声明这个注解的生存时间,包含了一个RetentionPolicy
的枚举类的value
成员变量。
1 2 3 4 5 6
| @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) 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 @Retention(RetentionPolicy.RUNTIME) @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()); } } } } }
|