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

时间:2016-12-01 01:41:46

标签: java reflection annotations

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个对象,而不是MethodField个对象。

1 个答案:

答案 0 :(得分:2)

doc的“Retrieving Annotations”部分在描述检索重复注释的正确方法方面做得不是很好。他们提到.getAnnotationByType()对遗留代码有用,getAnnotations(Class<T>)方法doesn't exist

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

null

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