1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.agent.plugin.core.util;
19
20 import lombok.AccessLevel;
21 import lombok.NoArgsConstructor;
22 import lombok.SneakyThrows;
23
24 import java.lang.reflect.Field;
25 import java.util.Optional;
26
27
28
29
30 @NoArgsConstructor(access = AccessLevel.PRIVATE)
31 public final class AgentReflectionUtils {
32
33
34
35
36
37
38
39
40
41
42 public static <T> T getFieldValue(final Object target, final String fieldName) {
43 Optional<Field> field = findField(fieldName, target.getClass());
44 if (field.isPresent()) {
45 return getFieldValue(target, field.get());
46 }
47 throw new IllegalStateException(String.format("Can not find field name `%s` in class %s.", fieldName, target.getClass()));
48 }
49
50 @SuppressWarnings("unchecked")
51 @SneakyThrows(IllegalAccessException.class)
52 private static <T> T getFieldValue(final Object target, final Field field) {
53 boolean accessible = field.isAccessible();
54 if (!accessible) {
55 field.setAccessible(true);
56 }
57 T result = (T) field.get(target);
58 if (!accessible) {
59 field.setAccessible(false);
60 }
61 return result;
62 }
63
64 private static Optional<Field> findField(final String fieldName, final Class<?> targetClass) {
65 Class<?> currentTargetClass = targetClass;
66 while (Object.class != currentTargetClass) {
67 try {
68 return Optional.of(currentTargetClass.getDeclaredField(fieldName));
69 } catch (final NoSuchFieldException ignored) {
70 currentTargetClass = currentTargetClass.getSuperclass();
71 }
72 }
73 return Optional.empty();
74 }
75 }