Java 8引入了repeating annotations,但不得不将它们放在现有结构中,而这种结构并没有直接支持它们。他们通过引入@Repeatable
元注释来实现这一点,但是根据对象上是否有一个或多个注释,您会得到不同的行为:
如果存在多个所请求类型的注释,您可以先获取容器注释来获取它们。
这意味着如果只有一个注释存在,则不能使用容器注释,并且看起来就是这样。我写了以下内容来一起处理一个和多个案例,但它似乎过于复杂:
public static <C, T> List<T> getAnnotations(
Method m, Class<C> containerClass, Class<T> annotationClass) {
C container = m.getAnnotation(containerClass);
if (container != null && container.value().length > 0) {
return ImmutableList.copyOf(container.value());
}
// apparently the @Container isn't considered set unless
// there's *repeated* @Annotation elements
T annotation = m.getAnnotation(annotationClass);
if (annotation != null) {
return ImmutableList.of(annotation);
}
return ImmutableList.of();
}
有更清洁的方法吗?文档还提到使用AnnotatedElement
,但我不知道如何使用它;这些方法似乎只接受Class
个对象,而不是Method
或Field
个对象。
答案 0 :(得分:2)
doc的“Retrieving Annotations”部分在描述检索重复注释的正确方法方面做得不是很好。他们提到.getAnnotationByType()
对遗留代码有用,getAnnotations(Class<T>)
方法doesn't exist。
丢失的方法最初让我感到困惑所以我坚持使用遗留行为(因此是辅助方法),但是正确的方法似乎是.getAnnotationsByType()
来处理这两种情况(并且作为奖励永远不会返回{{1 }}),所以你可以简单地说:
null
获取yourMethod.getAnnotationsByType(YourRepeatableAnnotation.class)
上的所有@YourRepeatableAnnotation
注释,如果方法未注释,则获取空数组。