如果注释包含闭包字段,则使用带注释字段实现特征的类将丢失对特征字段的注释

时间:2018-01-09 11:13:12

标签: groovy annotations traits groovyscriptengine

#!/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中处理它们?

$ groovy -version
Groovy Version: 2.4.12 JVM: 1.8.0_144 Vendor: Azul Systems, Inc. OS: Linux

1 个答案:

答案 0 :(得分:0)

可悲的是,这是Groovy的默认行为。

@CompileStatic注释您的特征可以解决此问题。