首页 > 解决方案 > 在 Groovy 注释中传递枚举数组

问题描述

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

@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(){}
}

有任何想法吗?

标签: javaarraysgroovyannotations

解决方案


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

鉴于您已经在使用单独的类来提供数组,您可以SomeAnnotation用它的“提供者”替换。

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

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接口并SomeAnnotation获取java.lang.Class对象。


推荐阅读