从枚举类型和序数中获取枚举值

时间:2012-12-14 01:48:41

标签: java reflection enums

public <E extends Enum> E decode(java.lang.reflect.Field field, int ordinal) {
    // TODO
}

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

4 个答案:

答案 0 :(得分:15)

field.getType().getEnumConstants()[ordinal]

就足够了。一条线;直截了当。

答案 1 :(得分: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];
}

答案 2 :(得分:2)

ExampleTypeEnum value = ExampleTypeEnum.values()[ordinal]

答案 3 :(得分:0)

根据标题,建议

List<String> someList = ['1', '2', '3', '4'];

final String firstString = someList.removeAt(0);
final String restString = someList.join(' ');

print(firstString); // 1
print(restString); // 2 3 4

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