我不知道为什么,但我无法将数组传递给声明为分隔变量的注释。
@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/