Java 1.8 Annotations 注解
在 Java 8 中,注解是可以重复的。让我通过下面的示例代码,来看看到底是咋回事。
首先,我们定义一个包装注解,里面包含了一个有着实际注解的数组:
@interface Hints {
Hint[] value();
}
@Repeatable(Hints.class)
@interface Hint {
String value();
}
Java 8 中,通过 @Repeatable
,允许我们对同一个类使用多重注解:
第一种形态:使用注解容器(老方法)
@Hints({@Hint("hint1"), @Hint("hint2")})
class Person {}
第二种形态:使用可重复注解(新方法)
@Hint("hint1")
@Hint("hint2")
class Person {}
使用第二种形态,Java 编译器能够在内部自动对 @Hint
进行设置。这对于需要通过反射来读取注解信息时,是非常重要的。
Hint hint = Person.class.getAnnotation(Hint.class);
System.out.println(hint); // null
Hints hints1 = Person.class.getAnnotation(Hints.class);
System.out.println(hints1.value().length); // 2
Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class);
System.out.println(hints2.length); // 2
尽管我们绝对不会在 Person
类上声明 @Hints
注解,但是它的信息仍然是可以通过 getAnnotation(Hints.class)
来读取的。
并且,getAnnotationsByType
方法会更方便,因为它赋予了所有 @Hints
注解标注的方法直接的访问权限。
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@interface MyAnnotation {}