【发布时间】:2012-10-08 12:59:49
【问题描述】:
我有一个枚举如下:
public enum SomeType {
SOME_KEY (some-display-value-as-label);
private String label;
private SomeType(String label){
this.label=label;
}
public String getLabel() {
return label;
}
public void setLabel(String value) {
this.label = value;
}
}
现在我正在使用 google 反射库,并提出了一个自定义注释,我在上面使用@makejson 之类的注释标记了上面的枚举。
这个想法是在应用启动时使用 @makejson 注解对所有类的反射进行扫描,然后为每个枚举生成 json 对象。
我正在尝试做的是在启动类中:
Reflections reflections = new Reflections("my.package.name");
Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(MakeJson.class);
for (Class<?> annotated : annotatedClasses) {
if (annotated.isEnum()) {
MakeJson j = annotated.getAnnotation(MakeJson.class);
Object[] constants = annotated.getEnumConstants();
Method[] methods = annotated.getMethods();
Method getValue = null;
for (Method m : methods) {
if ("valueOf".equals(m.getName())) {
getValue = m; //get Reference of valueOf method
break;
}
}
//List<Object> labels = Arrays.asList(m.invokem.getReturnType().isEnum()(annotated));
for (Object constant : constants) {
System.out.println(constant.toString());
System.out.println(getValue.invoke(annotated,constant.toString()));
}
}
}
此代码因以下异常而中断:线程“main”java.lang.IllegalArgumentException 中的异常:参数数量错误
任何帮助将不胜感激。最终目标是能够获得 SomeType{SOME_KEY:"display-value"} 的 json 对象。为此,我无法使用反射获取枚举常量的值。
【问题讨论】:
-
老实说:我发现可变的
enum是一个非常奇怪的构造,并认为它是一种代码气味。 -
您能否进一步澄清一下“代码气味”!另外,我不希望枚举是可变的,因为我不打算修改它。我想要的只是动态地生成一个 JSON,这样我就不需要在任何地方对类名进行硬编码。这必须在客户端使用。
-
为什么不简单地使用“GSON”并让它为您生成 JSON?它具有您正在寻找的所有功能,包括注释和其他东西。
-
@seba.wagner:GSON 将任何现有的 Enum 对象转换为具有封装类中属性名称的字符串,例如对于属性私有 SomeType 类型,GSON 执行 {...,type:"SOME_KEY", ...}。我需要整个 Enum 作为 json,我认为 GSON 不这样做!
-
@JoachimSauer 可变的
enum是一个奇怪的概念,但我不明白这与原始问题有何关系。在我看来,他并没有试图做那样的事情。
标签: java json reflection enums annotations