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

@Target 注解

如果没有指定使用的位置,则可以在任意位置使用,@Target 用于指定在什么位置使用注解。一共有10个取值:

  1. public enum ElementType {
  2. //只能用在类、接口、枚举类型上。
  3. TYPE,
  4. //字段声明和枚举常量
  5. FIELD,
  6. //只能用在方法声明上
  7. METHOD,
  8. //只能用在参数的声明上
  9. PARAMETER,
  10. //只能用在构造方法的声明上
  11. CONSTRUCTOR,
  12. //只能用在局部变量声明上
  13. LOCAL_VARIABLE,
  14. //只能用在注解上
  15. ANNOTATION_TYPE,
  16. //只能用在包上
  17. PACKAGE,
  18. TYPE_PARAMETER,
  19. TYPE_USE
  20. }

如果 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 注解即可。如果没有写此注解,则无法被子类继承。

  1. //自定义一个注解
  2. @interface AnnoationDefault
  3. {
  4. public String key() default "var1";
  5. public String value() default "value1";
  6. }
  7. @Target(ElementType.TYPE)
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Documented
  10. @Inherited //如果父类使用了HeritedApplication注解,则子类应该继承
  11. @AnnoationDefault
  12. @interface HeritedApplication {
  13. }
  14. //父类使用了@HeritedApplication注解
  15. @HeritedApplication
  16. class Person {
  17. }
  18. //Employee子类应该继承@HeritedApplication注解
  19. class Employee extends Person{
  20. }
  21. // 测试子类有没有继承@HeritedApplication注解
  22. class AnnotationInherited{
  23. public static void main(String[] args) throws Exception
  24. {
  25. Class clazz = Employee.class ;
  26. //Employee类是否有@HeritedApplication
  27. if(clazz.isAnnotationPresent(HeritedApplication.class)){
  28. System.out.println("true");
  29. }
  30. }
  31. }

运行结果:结果说明子类继承了 @HeritedApplication 注解。