元注解(修饰注解的注解)的种类:
1.@Retention
1)属性value ,配置枚举RetentionPolicy类型的值
2)RetentionPolicy有3个值:CLASS,RUNTIME,SOURCE。
RetentionPolicy.RUNTIME表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时, 所以他们可以用反射的方式读取。
RetentionPolicy.CLASS表示注解的信息编译期被保留在class文件(字节码文件),但在运行时不会被虚拟机读取。
RetentionPolicy.SOURCE表示注解的信息会被编译器抛弃,不会留在class文件,注解的信息只会留在源文件。
2.@Target
1)属性value,配置枚举ElementType类型的值
可选值有:ANNOTATION_TYPE
,CONSTRUCTOR
,FIELD
,LOCAL_VARIABLE
,METHOD
,PACKAGE
,PARAMETER
,TYPE
3.@Document注解
用于指定被该元注解修饰的Annotation类将被javadoc工具提取成文档。
@Documented注解必须要和策略为RUNTIME的@Retention注解一起使用,默认情况下,javadoc是不包括注解。
4.@Inherited注解
通过使用@Inherited,可以让子类Class对象使用getAnnotations()获取父类被@Inherited修饰的注解。
继承java.lang.Annotation
注解是不支持继承的,不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口
注解的基础类型
1.所有的基本类型(int、float、boolean、byte、double、char、long、short)
2.String 2.Class 3.enum 4.Annotation 5.上述类型的数组
注解通常搭配反射来使用的常用方法
Java在java.lang.reflect 反射包下新增了AnnotatedElement接口,它主要用于表示目前正在 VM 中运行的程序中已使用注解的元素,通过该接口提供的方法可以利用反射技术地读取注解的信息。
1.getAnnotation(Class<A> annotationClass) 存在返回指定类型的注解。
2.getAnnotations() 返回此元素上存在的所有注解,包括从父类继承的。
3.isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果指定类型的注解存在于此元素上,则返回 true,否则返回 false。
4.getDeclaredAnnotations()返回直接存在于此元素上的所有注解,注意,不包括父类的注解,调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响,没有则返回长度为0的数组。