检索枚举的注释值

时间:2019-02-12 10:23:50

标签: java enums java-annotations

我有这些注释:

@interface NotNull {
  boolean value() default false;
}

@interface Type {
  Class<?> value();
}

然后我将它们与一个枚举一起使用:

public enum KeyMap implements IMapEnum {

  @Type(Integer.class)
  @NotNull
  USER_ID("user_id", "userId"),

  @NotNull
  USER_HANDLE("user_handle", "userHandle"),

  @NotNull
  USER_EMAIL("user_email", "userEmail");

  private String key;
  private String value;

  KeyMap(String k, String v) {
    this.key = k;
    this.value = v;
  }

  @Override
  public String getKey() {
    return this.key;
  }

  @Override
  public String getValue() {
    return this.value;
  }

}

我的问题是-如何为枚举的每个实例检索注释的值?正在实现的接口很简单,实际上不是问题的一部分:

public interface IMapEnum {
  String getKey();
  String getValue();
}

但是也许有人可以展示如何使用getKeygetValue方法检索注释?

1 个答案:

答案 0 :(得分:1)

首先,您需要在注释中添加runtime retention,以便可以使用反射来读取它们:

@Retention(RetentionPolicy.RUNTIME)
@interface NotNull {
    boolean value() default false;
}

@Retention(RetentionPolicy.RUNTIME)
@interface Type {
    Class<?> value();
}

然后,您可以使用反射来获取将枚举常量视为类字段的注释:

Field field = KeyMap.class.getField(KeyMap.USER_ID.name());
Annotation[] annotations = field.getDeclaredAnnotations();
System.out.println(Arrays.toString(annotations));

将打印:

[@Type(value=java.lang.Integer.class), @NotNull(value=false)]