import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

enum Test {
    TEST1,
    TEST2,
    TEST3
}

class Ideone {

    private Test directEnumTypeReference;
    private Enum<Test> baseEnumTypeReference;

    public static void main(String[] args) throws NoSuchFieldException {
        Ideone ideone = new Ideone();
        ideone.directEnumTypeReference = Test.TEST1;
        ideone.baseEnumTypeReference = Test.TEST2;

        Class directEnumClass = getEnumType("directEnumTypeReference");
        ideone.directEnumTypeReference = (Test) Enum.valueOf(directEnumClass, "TEST3");

        Class baseGenericTypeClass = getEnumType("baseEnumTypeReference");
        ideone.baseEnumTypeReference = Enum.valueOf(baseGenericTypeClass, "TEST3");

        System.out.println(ideone.directEnumTypeReference);
        System.out.println(ideone.baseEnumTypeReference);

    }

    private static Class<?> getEnumType(String fieldName) throws NoSuchFieldException {
        Field field = Ideone.class.getDeclaredField(fieldName);
        Type genericFieldType = field.getGenericType();
        Class<?> enumType;

        // Handles Enum<Test>
        if (genericFieldType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) genericFieldType;
            Type actualTypeArgument = parameterizedType.getActualTypeArguments()[0];
            enumType = (Class) actualTypeArgument;
        }
        // Handles Test
        else {
            enumType = field.getType();
        }

        return enumType;
    }
}