Класс, реализующий черту с аннотированным полем, теряет аннотацию на поле черты, если аннотация содержит поле закрытия
#!/usr/bin/env groovy
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationWithClosure {
Class closure() default { true }
}
trait TraitWithAnnotatedField {
@AnnotationWithClosure(closure = {})
String foo
@AnnotationWithClosure()
String bar
}
class Main implements TraitWithAnnotatedField {
def printFields() {
this.class.declaredFields.each {
println "${it} is annotated ${it.isAnnotationPresent(AnnotationWithClosure.class)}"
}
}
}
new Main().printFields()
Когда я выполняю этот скрипт, в консоли я вижу следующее:
private java.lang.String Main.TraitWithAnnotatedField__bar помечается аннотацией: true
private java.lang.String Main.TraitWithAnnotatedField__foo аннотирован: false
Может кто-нибудь объяснить это поведение? Как правильно получать аннотации с замыканиями из полей признаков и обрабатывать их в заводной цвет?
$ groovy -version
Groovy Version: 2.4.12 JVM: 1.8.0_144 Vendor: Azul Systems, Inc. OS: Linux
0 ответов
К сожалению, это стандартное поведение Groovy.
Аннотируя вашу черту @CompileStatic
решает проблему, хотя