获取重复注释值的正确方法?

dim*_*414 3 java reflection annotations

Java 8 引入了重复注解,但不得不将它们硬塞在不直接支持它们的现有结构上。他们通过引入@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();
}
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来解决这个问题?文档还提到使用,AnnotatedElement但我不知道如何使用它;这些方法似乎只接受Class对象,而不是MethodField对象。

dim*_*414 5

文档的“检索注释”部分并没有很好地描述检索重复注释的正确方法。他们提到.getAnnotationByType()对遗留代码很有用,以及一种不存在getAnnotations(Class<T>)方法。

缺少的方法最初让我感到困惑,所以我坚持使用遗留行为(因此是辅助方法),但正确的方法似乎可以.getAnnotationsByType()处理这两种情况(并且永远不会返回null),所以你可以简单地说:

yourMethod.getAnnotationsByType(YourRepeatableAnnotation.class)
Run Code Online (Sandbox Code Playgroud)

获取 上的所有@YourRepeatableAnnotation注释yourMethod,如果方法未注释,则获取空数组。