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