首先我们来说一说@Retention这个注解
这个注解表明了注解在类上的存在时间
@Retention可以设置三个值
1) RetentionPolicy.RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
2) RetentionPolicy.CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
3) RetentionPolicy.SOURCE 编译器要丢弃的注释。
RetentionPolicy 是一个枚举,里面有三个值,分别是SOURCE,CLASS,RUNTIME
然而只有在自定义注解中加入@Retention(RetentionPolicy.RUNTIME),才能让反射机制在程序运行的时候动态的获取到。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD,ElementType.TYPE,ElementType.PACKAGE,ElementType.PARAMETER} )
@Documented
public @interface Result
{
String value();
String[] arrays();
}
通过如下的Java反射代码便可以拿到Annotation的元数据。
/**
* 反射获取Annotation
*
* Class<?> clazz = Class.forName("org.oa.test.JdbcTest");
*
* Method sayHello = clazz.getMethod("sayHello");
*
* Annotation[] annotations = clazz.getDeclaredAnnotations();
*
* Result result = (Result)annotations[0];
*
* System.out.println(result.arrays()[1]);
*
*
*/