View Javadoc
1   package top.infra.common;
2   
3   import lombok.extern.slf4j.Slf4j;
4   
5   import java.lang.reflect.Method;
6   import java.util.Arrays;
7   import java.util.Map;
8   
9   @Slf4j
10  public abstract class EnumUtils {
11  
12      private static Method methodEnumConstantDirectory;
13  
14      static {
15          try {
16              //enumConstantDirectory is much faster than for-loop
17              methodEnumConstantDirectory = Class.class.getDeclaredMethod("enumConstantDirectory");
18              methodEnumConstantDirectory.setAccessible(true);
19          } catch (final ReflectiveOperationException ex) {
20              log.error("can not find Class.enumConstantDirectory, fall back to for-loop");
21          }
22      }
23  
24      private EnumUtils() {
25      }
26  
27      @SuppressWarnings("unchecked")
28      public static <E extends Enum<E>> E getEnumValue(final Class<E> enumClass, final String enumName) {
29          try {
30              final E result;
31              if (methodEnumConstantDirectory != null) {
32                  final Map<String, E> constantDic = (Map<String, E>) methodEnumConstantDirectory.invoke(enumClass);
33                  result = constantDic.get(enumName);
34              } else {
35                  result = Arrays.stream(enumClass.getEnumConstants())
36                      .filter(constant -> constant.name().equals(enumName))
37                      .findAny()
38                      .orElse(null);
39              }
40              return result;
41          } catch (final ReflectiveOperationException ignored) {
42              return null;
43          }
44      }
45  
46      @SuppressWarnings("unchecked")
47      public static <E extends Enum<E>> E valueOf(final Class<E> enumClass, final String enumName) {
48          try {
49              final E result;
50              final Method method = enumClass.getDeclaredMethod("valueOf", String.class);
51              result = (E) method.invoke(enumClass, enumName);
52              return result;
53          } catch (ReflectiveOperationException ignored) {
54              return null;
55          }
56      }
57  
58      public static Object objectValueOf(final Class<?> enumClass, final String enumName) {
59          try {
60              final Object result;
61              final Method method = enumClass.getDeclaredMethod("valueOf", String.class);
62              result = method.invoke(enumClass, enumName);
63              return result;
64          } catch (ReflectiveOperationException ignored) {
65              return null;
66          }
67      }
68  }