java - 如何找出 EnumMap 中使用的枚举?

标签 java reflection enums

我有一个带有内部枚举和 EnumMap 的测试类,如下所示。我如何找出 EnumMap 中使用了哪个枚举?

enum MyEnum { ENUM1, ENUM2 }
EnumMap<MyEnum, String> emap = new EnumMap<>( MyEnum.class );
public void discover() {
  Class<?> eclass = ???;
  System.out.println( eclass );
}

应该打印

MyEnum.class

最佳答案

如果 map 不为空,您可以检索一个键并检查其类。否则,唯一的方法是通过反射访问 EnumMap 的 keyType 私有(private)字段(该字段未通过公共(public) API 公开)。

在第一种情况下你可以这样做:

Iterator<?> it = map.keySet().iterator();
while (it.hasNext()) {
  Object key = it.next();
  if (key != null) return key.getDeclaringClass();
}

在第二种情况下(显然也适用于非空枚举)你可以使用:

private static Class<?> enumMapType(EnumMap<?, ?> map) {
  try {
    Field keyType = EnumMap.class.getDeclaredField("keyType");
    keyType.setAccessible(true);
    return (Class<?>) keyType.get(map);
  } catch (IllegalAccessException | NoSuchFieldException e) {
    throw new AssertionError("Could not find EnumMap type", e);
  }
}

如果 EnumMap 的内部实现发生变化,这可能会中断,最好找到解决您的要求的方法。

关于java - 如何找出 EnumMap 中使用的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33694654/

相关文章:

java - 更新分位数而不是重新计算

java - ZonedDateTime 和 OffsetDateTime 有什么区别?

c# - 使用反射调用类的静态方法

c# - 使用反射跨同一程序集的不同版本使用类对象

java - 将 instanceof 与 Java 枚举一起使用

c++ - 是否可以使用枚举来访问数组?

java - 为什么我在尝试使用局部变量时收到 "cannot find symbol"错误?

java - JSTL foreach 和智能感知

reflection - 在 F# 引号内嵌入变量

c# - 检查时出现枚举错误