@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MethodRateLimit {}
@Target 注解
如果没有指定使用的位置,则可以在任意位置使用,@Target 用于指定在什么位置使用注解。一共有10个取值:
public enum ElementType {//只能用在类、接口、枚举类型上。TYPE,//字段声明和枚举常量FIELD,//只能用在方法声明上METHOD,//只能用在参数的声明上PARAMETER,//只能用在构造方法的声明上CONSTRUCTOR,//只能用在局部变量声明上LOCAL_VARIABLE,//只能用在注解上ANNOTATION_TYPE,//只能用在包上PACKAGE,TYPE_PARAMETER,TYPE_USE}
如果 value 要设置多个值,可以使用下面方法,放在大括号中:@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention 注解
Retention 为注解的保留策略,他们与 @Retention 元注释类型一起指定注解将保留多长时间。有三个值:
RetentionPolicy.SOURCE:这种类型的 Annotations 只在源代码级别保留,编译时就会被忽略RetentionPolicy.CLASS: 这种类型的 Annotations 编译时被保留,在 class 文件中存在,但 JVM 将会忽略RetentionPolicy.RUNTIME:这种类型的 Annotations 将被 JVM 保留,他们能在运行时被 JVM 或其他使用反射机制的代码读取和使用。
@Documented 注解
Documented 注解表明这个注解应该被 javadoc工具记录。默认情况下,javadoc 是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中。即 使用 javadoc 命令生成 TestAnnotations.html 文件中,会有注解的描述信息。
@Inherited 注解
@Inherited 注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用 @Inherited 注解即可。如果没有写此注解,则无法被子类继承。
//自定义一个注解@interface AnnoationDefault{public String key() default "var1";public String value() default "value1";}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited //如果父类使用了HeritedApplication注解,则子类应该继承@AnnoationDefault@interface HeritedApplication {}//父类使用了@HeritedApplication注解@HeritedApplicationclass Person {}//Employee子类应该继承@HeritedApplication注解class Employee extends Person{}// 测试子类有没有继承@HeritedApplication注解class AnnotationInherited{public static void main(String[] args) throws Exception{Class clazz = Employee.class ;//Employee类是否有@HeritedApplicationif(clazz.isAnnotationPresent(HeritedApplication.class)){System.out.println("true");}}}
运行结果:结果说明子类继承了 @HeritedApplication 注解。
