java - 在 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(){}
}
有任何想法吗?
解决方案
注释需要内联常量。因此,即使变量被声明为静态和最终的,您也无法完成您想要实现的目标。
鉴于您已经在使用单独的类来提供数组,您可以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
对象。
推荐阅读
- android - Android 和 iOS 标签行数 Angular/Nativescript
- sql - Oracle中流数据的开始和结束时间
- django - Django-Filter“包含”相关领域
- string - 如果值中的字符数小于 8,如何使用 TCL 将值添加到 csv 文件并添加空格
- dictionary - 如何从函数构建地图
- python - 无法将 Discord.py 机器人成功部署到使用 mongoDB 存储数据的 Heroku
- javascript - 我可以将 x-template 脚本导入 HTML 文件吗?
- php - PHP Array 只显示最后推送的值
- npm - npm 发布:详细堆栈错误:400 错误请求
- sed - grep并替换bash中的多行值