Groovy不支持@Repeatable注释吗?

Groovy不支持@Repeatable注释吗?,groovy,annotations,Groovy,Annotations,我用Groovy编写代码,在Java8@Repeatable元注释方面遇到了问题。我认为我做的每件事都是对的,但Groovy似乎不认可@Repeatable。这是我的示例代码;我希望这两个批注中的信息都存储在MyAnnotationArray中: import java.lang.annotation.* class MyClass { @MyAnnotation(value = "val1") @MyAnnotation(value = "val2") void anno

我用Groovy编写代码,在Java8@Repeatable元注释方面遇到了问题。我认为我做的每件事都是对的,但Groovy似乎不认可@Repeatable。这是我的示例代码;我希望这两个批注中的信息都存储在MyAnnotationArray中:

import java.lang.annotation.*

class MyClass 
{
   @MyAnnotation(value = "val1")
   @MyAnnotation(value = "val2")
   void annotatedMethod() 
   {
       println("annotated method called")
   }

   public static void main(String... args)
   {
      MyClass ob = new MyClass()
      ob.annotatedMethod()
      java.lang.reflect.Method m = ob.getClass().getMethod("annotatedMethod")
      List annos = m.getAnnotations()
      println("annos = $annos")
   }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyAnnotationArray) 
public @interface MyAnnotation
{
    String value() default "val0";
}

public @interface MyAnnotationArray 
{
   MyAnnotation[] MyAnnotationArray()
}
发生的情况是,我得到了以下错误:

Caught: java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface MyAnnotation: @MyAnnotation(value=val2)
java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface MyAnnotation: @MyAnnotation(value=val2)
如果我不使用@Repeatable元注释,这就是我得到的结果

如果我省略了一个重复的MyAnnotation,代码就可以正常工作;然后就没有错误了,我就可以按预期读取注释值了

Groovy是否可能不支持@Repeatable元注释?我找不到任何明确说明这一点的文档,尽管暗示可能是这样(向下滚动到第88项)

似乎不被支持 我使用了
Java1.8
Groovy2.4.11

编译和反编译相同的代码后,我得到以下结果:

爪哇:

groovy:

@MyAnnotation("val1")
@MyAnnotation("val2")
public void annotatedMethod()
{
  System.out.println("annotated method called");null;
}
因此,作为groovy使用中的变通方法

//note the square brackets
@MyAnnotationArray( [@MyAnnotation("val1"), @MyAnnotation("val2")] )
public void annotatedMethod()
{
  System.out.println("annotated method called");
}

完整脚本(因为注释声明中有一些错误)

还尝试了
groovy 3.0.0-SNAPSHOT
-结果与
2.4.11

是的,groovy长期以来支持“可重复”注释,即使在Java 5中,只要保留策略只是源代码。这就是允许多个@Grab语句的原因,例如,没有外部@Grapes容器注释。由于只保留在源代码中,因此它们对于AST转换和Groovy编译器本身(以及其他源代码处理器)非常有用,但在其他任何地方都没有真正的用处。我们目前根本不支持@Repeatable,但计划在将来的版本中提供

//note the square brackets
@MyAnnotationArray( [@MyAnnotation("val1"), @MyAnnotation("val2")] )
public void annotatedMethod()
{
  System.out.println("annotated method called");
}
import java.lang.annotation.*

class MyClass 
{
   //@MyAnnotation(value = "val1")
   //@MyAnnotation(value = "val2")
    @MyAnnotationArray( [@MyAnnotation("val1"), @MyAnnotation("val2")] )
    public void annotatedMethod()
    {
      System.out.println("annotated method called");
    }
   public static void main(String... args)
   {
      MyClass ob = new MyClass()
      ob.annotatedMethod()
      java.lang.reflect.Method m = ob.getClass().getMethod("annotatedMethod")
      List annos = m.getAnnotations()
      println("annos = $annos")
   }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(MyAnnotationArray) 
public @interface MyAnnotation
{
    String value() default "val0";
}

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationArray 
{
   MyAnnotation[] value()
}