注释是使用@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()
}