//package tester.utilities;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import sun.reflect.FieldAccessor;
import sun.reflect.ReflectionFactory;
/**
* This class can be used to set field values regardless of the modifiers.
*
* @author Weston Jossey
* @since Feb 1 2009
*/
public class ReflectionHelper {
private static final String MODIFIERS_FIELD = "modifiers";
private static final ReflectionFactory reflection = ReflectionFactory
.getReflectionFactory();
/**
* Set the value of the field of the object to the given value.
*
* @param original
* object to modify
* @param field
* field to modify
* @param value
* new value for the given object and field
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void setStaticFinalField(Object original, Field field,
Object value) throws NoSuchFieldException, IllegalAccessException {
// we mark the field to be public
field.setAccessible(true);
// next we change the modifier in the Field instance to
// not be final anymore, thus tricking reflection into
// letting us modify the static final field
Field modifiersField = Field.class.getDeclaredField(MODIFIERS_FIELD);
modifiersField.setAccessible(true);
int modifiers = modifiersField.getInt(field);
// blank out the final bit in the modifiers int
modifiers &= ~Modifier.FINAL;
modifiersField.setInt(field, modifiers);
FieldAccessor fa = reflection.newFieldAccessor(field, false);
fa.set(original, value);
}
}