-
-
Notifications
You must be signed in to change notification settings - Fork 103
/
ReflectionHelper.java
89 lines (82 loc) · 2.76 KB
/
ReflectionHelper.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package net.aufdemrand.denizen.nms.util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
public class ReflectionHelper {
private static final Map<Class, Map<String, Field>> cachedFields = new HashMap<Class, Map<String, Field>>();
public static <T> T getFieldValue(Class clazz, String fieldName, Object object) {
Map<String, Field> cache;
if (cachedFields.containsKey(clazz)) {
cache = cachedFields.get(clazz);
}
else {
cache = new HashMap<String, Field>();
cachedFields.put(clazz, cache);
}
Field field;
try {
if (cache.containsKey(fieldName)) {
field = cache.get(fieldName);
}
else {
field = clazz.getDeclaredField(fieldName);
}
if (!field.isAccessible()) {
field.setAccessible(true);
}
cache.put(fieldName, field);
return (T) field.get(object);
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void setFieldValue(Class clazz, String fieldName, Object object, Object value) {
Map<String, Field> cache;
if (cachedFields.containsKey(clazz)) {
cache = cachedFields.get(clazz);
}
else {
cache = new HashMap<String, Field>();
cachedFields.put(clazz, cache);
}
Field field;
try {
if (cache.containsKey(fieldName)) {
field = cache.get(fieldName);
}
else {
field = clazz.getDeclaredField(fieldName);
}
if (!field.isAccessible()) {
field.setAccessible(true);
}
fixFinal(field);
cache.put(fieldName, field);
field.set(object, value);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void fixFinal(Field field) {
int mod = field.getModifiers();
if (Modifier.isFinal(mod)) {
setFieldValue(Field.class, "modifiers", field, mod & ~Modifier.FINAL);
}
}
public static Map<String, Field> getFields(Class clazz) {
if (cachedFields.containsKey(clazz)) {
return cachedFields.get(clazz);
}
Map<String, Field> fields = new HashMap<String, Field>();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
fields.put(field.getName(), field);
}
cachedFields.put(clazz, fields);
return fields;
}
}