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);
}
int mod = field.getModifiers();
if (Modifier.isFinal(mod)) {
setFieldValue(Field.class, "modifiers", field, mod & ~Modifier.FINAL);
}
cache.put(fieldName, field);
field.set(object, value);
}
catch (Exception e) {
e.printStackTrace();
}
}
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;
}
}