加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:30:51 所属栏目:Java 来源:网络整理
导读:我有一个带有内部枚举和EnumMap的测试类,如下所示.如何找出EnumMap中使用的枚举? enum MyEnum { ENUM1,ENUM2 }EnumMapMyEnum,String emap = new EnumMap( MyEnum.class );public void discover() { Class? eclass = ???; System.out.println( eclass );} 应
我有一个带有内部枚举和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

解决方法

如果映射不为空,则可以检索一个键并检查其类.否则唯一的方法是通过反射访问EnumMap的keyType私有字段(该字段不通过公共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的内部实现发生变化,这可能会破坏,最好找到满足您需求的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读