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

Java 获取重复注释值的正确方法?,java,reflection,annotations,Java,Reflection,Annotations,Java8引入了,但不得不将它们限制在现有结构之上,而现有结构并不直接支持它们。他们通过引入@Repeatable元注释来实现这一点,但根据对象上是否有一个或多个注释,您会得到不同的行为: 如果存在多个请求类型的批注,则可以通过首先获取其容器批注来获取这些批注 这意味着,如果只存在一个注释,则不能使用容器注释,瞧,情况似乎就是这样。我写了以下内容来处理一个或多个案例,但似乎过于复杂: public static <C, T> List<T> getAnnotations(

Java8引入了,但不得不将它们限制在现有结构之上,而现有结构并不直接支持它们。他们通过引入
@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();
}
公共静态列表getAnnotations(
方法m,类containerClass,类annotationClass){
C container=m.getAnnotation(containerClass);
if(container!=null&&container.value().length>0){
返回ImmutableList.copyOf(container.value());
}
//显然@Container不被认为是set,除非
//有*个重复的*@注释元素
T annotation=m.getAnnotation(annotationClass);
if(注释!=null){
返回不可变列表(注释);
}
返回ImmutableList.of();
}
有没有更干净的方法?文档中也提到了使用,但我不知道如何使用它;这些方法似乎只接受
对象,而不是
方法
字段
对象。

文档的“检索注释”部分没有很好地描述检索重复注释的正确方法。他们提到
.getAnnotationByType()
对于遗留代码很有用,并且提到了一个
getAnnotations(Class)
方法

缺少的方法最初让我感到困惑,因此我坚持使用遗留行为(因此使用helper方法),但正确的方法似乎是处理这两种情况的方法(作为奖励,它永远不会返回
null
),因此您可以简单地说:

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