【问题标题】:Get enum value from enum type and ordinal从枚举类型和序数中获取枚举值
【发布时间】:2012-12-14 01:48:40
【问题描述】:
public <E extends Enum> E decode(java.lang.reflect.Field field, int ordinal) {
    // TODO
}

假设field.getType().isEnum() 是true,我将如何生成给定序数的枚举值?

【问题讨论】:

  • Field 不是枚举。我已经更新了问题以澄清这一点,尽管我认为从标签中可以看出这一点。

标签: java reflection enums


【解决方案1】:
field.getType().getEnumConstants()[ordinal]

足够了。一条线;很简单。

【讨论】:

  • @SteveTaylor 除了整个表达式在Field和ClassxD的范围内
【解决方案2】:
ExampleTypeEnum value = ExampleTypeEnum.values()[ordinal]

【讨论】:

  • 请查看相关评论。
【解决方案3】:

要得到你想要的,你需要调用YourEnum.values()[ordinal]。你可以用这样的反射来做到这一点:

public static <E extends Enum<E>> E decode(Field field, int ordinal) {
    try {
        Class<?> myEnum = field.getType();
        Method valuesMethod = myEnum.getMethod("values");
        Object arrayWithEnumValies = valuesMethod.invoke(myEnum);
        return (E) Array.get(arrayWithEnumValies, ordinal);
    } catch (NoSuchMethodException | SecurityException
            | IllegalAccessException | IllegalArgumentException
            | InvocationTargetException e) {
        e.printStackTrace();
    }
    return null;
}

更新

正如@LouisWasserman 在他的评论中指出的那样,有更简单的方法

public static <E extends Enum<E>> E decode(Field field, int ordinal) {
    return (E) field.getType().getEnumConstants()[ordinal];
}

【讨论】:

  • 是的,我认为我做不到 return (Enum[])field.getType().getMethod("values").invoke(null))[ordinal]; 这样的事情。
  • 没关系那么,但类型应该是&lt;E extends Enum&lt;E&gt;&gt;
  • 简单得多:field.getType().getEnumConstants()[ordinal]
  • @LouisWasserman 如果您将评论移至答案,我会接受该答案,因为这显然是最佳答案。
【解决方案4】:

根据标题,建议

public <E extends Enum> E decode(Class<?> enumType, int ordinal) 
{
   return enumType.getEnumConstants()[ordinal];
}

被调用

YourEnum enumVal = decode(YourEnum.class, ordinal)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2010-10-11
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多