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
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 }