我有一个带有内部枚举和 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/