@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @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注解
@HeritedApplication
class Person {
}
//Employee子类应该继承@HeritedApplication注解
class Employee extends Person{
}
// 测试子类有没有继承@HeritedApplication注解
class AnnotationInherited{
public static void main(String[] args) throws Exception
{
Class clazz = Employee.class ;
//Employee类是否有@HeritedApplication
if(clazz.isAnnotationPresent(HeritedApplication.class)){
System.out.println("true");
}
}
}
运行结果:结果说明子类继承了 @HeritedApplication
注解。