0%

java自定义注解

文章字数:630,阅读全文大约需要2分钟

一、元注解(用于修饰注解)

  1. @Retention指定annotation指定标记注解的存储方式
    值有:

    1
    2
    3
    * `RetentionPolicy.SOURCE` 标记的注释仅保留在源级别中,并由编译器忽略。
    * `RetentionPolicy.CLASS` 标记的注释在编译时由编译器保留,但Java虚拟机`JVM`会忽略。
    * `RetentionPolicy.RUNTIME` 标记的注释由`JVM`保留,因此运行时环境可以使用它。
  2. @Documented注释表明,无论何时使用指定的注释,都应使用Javadoc工具记录这些元素。(默认情况下,注释不包含在Javadoc)

  3. @Target注释标记另一个注释,以限制可以应用注释的Java元素类型。目标注释指定以下元素类型之一作为其值
    可选值有:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    * `ElementType.TYPE` 可以应用于类的任何元素。
    * `ElementType.FIELD` 可以应用于字段或属性。
    * `ElementType.METHOD` 可以应用于方法级注释。
    * `ElementType.PARAMETER` 可以应用于方法的参数。
    * `ElementType.CONSTRUCTOR` 可以应用于构造函数。
    * `ElementType.LOCAL_VARIABLE` 可以应用于局部变量。
    * `ElementType.ANNOTATION_TYPE` 可以应用于注释类型。
    * `ElementType.PACKAGE` 可以应用于包声明。
    * `ElementType.TYPE_PARAMETER`
    * `ElementType.TYPE_USE`
  4. @Inherited注释表明注释类型可以从超类继承。当用户查询注释类型并且该类没有此类型的注释时,将查询类的超类以获取注释类型(默认情况下不是这样)。此注释仅适用于类声明。

  5. @RepeatableJava SE 8中引入的,@Repeatable注释表明标记的注释可以多次应用于相同的声明或类型使用(即可以重复在同一个类、方法、属性等上使用)。

自定义注解

例子

1
2
3
4
5
6
@Documented //javaDoc记录
@Retention(RetentionPolicy.RUNTIME) //运行环境可用
@Target({ElementType.TYPE}) //可用于任何元素
public @interface MyAnn {//自定义一个@Myann(value="")注解
String value() default "";
}

通过反射获取注解信息

  • 判断是否应用的某个注解
    1
    public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
  • 获取指定类型的注解信息
    1
    public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
  • 获取所有注解的信息
    1
    public Annotation[] getAnnotations()