Java创建自定义Annotation和使用自定义Annotation
malong 发布于 2021-04-04

注释是使用@interface创建的,后跟注释名,在本例中是ClassInfo。

注释类可以有一个或多个元素。它们看起来像方法。例如,在下面的代码中,我们有六个元素,即author、date、currentRevision、lastModified、lastModifiedBy和reviewers。

可以使用Default关键字为元素指定默认值

@Documented
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface ClassInfo {

    String author();

    String date();

    int currentRevision() default 1;

    String lastModified() default "N/A";

    String lastModifiedBy() default "N/A";

    // Note use of array
    String[] reviewers();
}

元注释

您可以看到,我们对自定义注释ClassInfo应用了很少的注释。这些被称为元注释,它提供了有关自定义注释的附加信息。它们就像如下所示:-
@Documented表示在JavaDoc中包含@ClassInfo注释。默认情况下,JavaDoc中不包含注释。
@Inherited表示继承子类中的@ClassInfo注释。默认情况下,不会继承批注。
@Target(ElementType.TYPE)指示@ClassInfo注释只能在类级别应用
@Retention(RetentionPolicy.RUNTIME)指示可以在运行时使用java反射访问@ClassInfo注释元素。

现在我们已经创建了自定义注释@ClassInfo,让我们在类中使用它

@ClassInfo (
   author = "John Doe",
   date = "3/17/2002",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
class MyClass {

}

请注意,在使用@ClassInfo注释时,我们跳过了currentRevision、lastModified和lastModifiedBy元素。默认值指定给这些元素。
让我们看看如何在运行时从定制的@ClassInfo注释中获取信息

public class AnnotationsTest {

    public static void main(String[] args) {
        printClassInfo(new MyClass());
    }

    public static void printClassInfo(Object object) {
        Class<?> clazz = object.getClass();
        if (clazz.isAnnotationPresent(ClassInfo.class)) {
            ClassInfo classInfo = clazz.getAnnotation(ClassInfo.class);
            System.out.println("author: " + classInfo.author());
            System.out.println("date: " + classInfo.date());
            System.out.println("currentRevision: " + classInfo.currentRevision());
            System.out.println("lastModified: " + classInfo.lastModified());
            System.out.println("lastModifiedBy: " + classInfo.lastModifiedBy());
            System.out.println("reviewers: " + Arrays.toString(classInfo.reviewers()));
        } else {
            System.out.println("Class Info is not available");
        }
    }
}

输出

Output

author: John Doe
date: 3/17/2002
currentRevision: 1
lastModified: N/A
lastModifiedBy: N/A
reviewers: [Alice, Bob, Cindy]

请注意,在使用@ClassInfo注释时,我们跳过了currentRevision、lastModified和lastModifiedBy元素。默认值指定给这些元素。
让我们看看如何在运行时从定制的@ClassInfo注释中获取信息

public static void main(String[] args) {
  printClassInfo(new MyClass());
  printClassInfo(new MyChildClass()); // same output as: new MyClass()
}
malong
关注 私信
文章
35
关注
0
粉丝
0