package lilypad.bukkit.connect.util;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ReflectionUtils {
private static final Field FIELD_MODIFIERS;
private static final Field FIELD_ACCESSSOR;
private static final Field FIELD_ACCESSSOR_OVERRIDE;
private static final Field FIELD_ROOT;
static {
Field fieldModifiers = null;
Field fieldAccessor = null;
Field fieldAccessorOverride = null;
Field fieldRoot = null;
try {
fieldModifiers = Field.class.getDeclaredField("modifiers");
fieldModifiers.setAccessible(true);
fieldAccessor = Field.class.getDeclaredField("fieldAccessor");
fieldAccessor.setAccessible(true);
fieldAccessorOverride = Field.class.getDeclaredField("overrideFieldAccessor");
fieldAccessorOverride.setAccessible(true);
fieldRoot = Field.class.getDeclaredField("root");
fieldRoot.setAccessible(true);
} catch (Exception exception) {
exception.printStackTrace();
}
FIELD_MODIFIERS = fieldModifiers;
FIELD_ACCESSSOR = fieldAccessor;
FIELD_ACCESSSOR_OVERRIDE = fieldAccessorOverride;
FIELD_ROOT = fieldRoot;
}
public static void setFinalField(Class<?> objectClass, Object object, String fieldName, Object value) throws Exception {
Field field = objectClass.getDeclaredField(fieldName);
field.setAccessible(true);
if (Modifier.isFinal(field.getModifiers())) {
FIELD_MODIFIERS.setInt(field, field.getModifiers() & ~Modifier.FINAL);
Field currentField = field;
do {
FIELD_ACCESSSOR.set(currentField, null);
FIELD_ACCESSSOR_OVERRIDE.set(currentField, null);
} while((currentField = (Field) FIELD_ROOT.get(currentField)) != null);
}
field.set(object, value);
}
@SuppressWarnings("unchecked")
public static <T> T getPrivateField(Class<?> objectClass, Object object, Class<T> fieldClass, String fieldName) throws Exception {
Field field = objectClass.getDeclaredField(fieldName);
field.setAccessible(true);
return (T) field.get(object);
}
}