java - 在 Groovy 注释中传递枚举数组

标签 java arrays groovy annotations

我不知道为什么,但我无法将数组传递给声明为分隔变量的注释。

@Target([ ElementType.METHOD, ElementType.TYPE ])
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface SomeCustomAnnotation {

  SomeEnum[] someValue()
}

_

class SomeDataFactory {

static final SOME_ENUM_ARRAY = [SOME_ENUM_1, SOME_ENUM_2].toArray()

  enum SomeEnum {
   SOME_ENUM_1, SOME_ENUM_2
   }
}

_

class SomeClass {

   @SomeAnnotation(someValue = [SOME_ENUM_1, SOME_ENUM_2]) //fine
   def someMethod1(){}

   @SomeAnnotation(someValue = SOME_ENUM_ARRAY ) //Groovyc: Expected enum value for attribute someValue in @com.somepackage.SomeAnnotation
   def someMethod2(){}
}

有什么想法吗?

最佳答案

注释需要内联常量。因此,即使变量被声明为静态和最终,您想要实现的目标也无法完成。

鉴于您已经使用单独的类来提供数组,您可以将 SomeAnnotation 替换为其“provider”。

有很多方法可以做到这一点,但这里是一个使用不同枚举的示例:

enum SomeDataProvider {

    SOME_ENUM_ARRAY_PROVIDER([SOME_ENUM_1, SOME_ENUM_2]);

    private List<SomeAnnotation> array

    SomeDataProvider(def array) {
         this.array = array
    }

    public List<SomeAnnotation> getSomeEnumArray() {
       return array;
    }
}

然后将声明注释的代码更改为:

@SomeAnnotation(someValue = SOME_ENUM_ARRAY_PROVIDER)
def someMethod2(){}

当然,您需要更改 SomeCustomAnnotation 所需的类型:

@interface SomeCustomAnnotation {

  SomeDataProvider[] someValue()
}

以及通过调用获取 SomeEnum[] 的处理:

methodg.getDeclaredAnnotation(SomeAnnotation.class)
       .someValue()
       .getSomeEnumArray();

您还可以将 SomeDataProvider 替换为接口(interface),并使 SomeAnnotation 采用 java.lang.Class 对象。

关于java - 在 Groovy 注释中传递枚举数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50102234/

相关文章:

java - 是否可以在 Fresco Lib 上加载 SVG?

javascript - javascript中的关联数组难题

在 gorm/groovy 上使用 mongodb 启动时出现 springboot 初始化错误

grails - 按值而不是按引用将对象属性复制到映射

java - 将分割字符串分配给已解析的 int

java - 观察者模式 : Internal vs. 外部注册

java - 跨团队强制执行 Github 存储库的编码标准

javascript - 具有最大数字索引的元素

Java使用正则表达式分割将字符串放入数组中

groovy - 如何从 Jenkins 工作流程调用 REST