Groovy不支持@Repeatable注释吗?
我用Groovy编写代码,在Java8@Repeatable元注释方面遇到了问题。我认为我做的每件事都是对的,但Groovy似乎不认可@Repeatable。这是我的示例代码;我希望这两个批注中的信息都存储在MyAnnotationArray中: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
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()
}