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对象,而不是Method或Field对象。
文档的“检索注释”部分并没有很好地描述检索重复注释的正确方法。他们提到.getAnnotationByType()对遗留代码很有用,以及一种不存在的getAnnotations(Class<T>)方法。
缺少的方法最初让我感到困惑,所以我坚持使用遗留行为(因此是辅助方法),但正确的方法似乎可以.getAnnotationsByType()处理这两种情况(并且永远不会返回null),所以你可以简单地说:
yourMethod.getAnnotationsByType(YourRepeatableAnnotation.class)
Run Code Online (Sandbox Code Playgroud)
获取 上的所有@YourRepeatableAnnotation注释yourMethod,如果方法未注释,则获取空数组。