Haj*_*cke 3 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
如果映射不为空,则可以检索一个键并检查其类.否则,唯一的方法是keyType通过反射访问EnumMap 的私有字段(该字段不通过公共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变更,这可能会破坏,最好找到解决方案的方法.
| 归档时间: | 
 | 
| 查看次数: | 371 次 | 
| 最近记录: |