Como han indicado otros carteles, setAccessiblesolo es aplicable a esa instancia de su java.lang.reflect.Field, por lo que no es necesario volver a configurar la accesibilidad a su estado original.
Sin embargo...
Si desea que sus llamadas field.setAccessible(true)sean persistentes, debe utilizar métodos subyacentes en java.lang.Classy java.lang.reflect.Field. Los métodos públicos le envían copias de la Fieldinstancia, por lo que se "olvida" cada vez que hace algo comoclass.getField(name)
import java.lang.reflect.*;
import sun.reflect.FieldAccessor;
public class Reflect {
private static Method privateGetDeclaredFields;
private static Method getFieldAccessor;
public static Field[] fields(Class<?> clazz) throws Exception {
return (Field[]) privateGetDeclaredFields.invoke(clazz, false);
}
public static <T> T get(Object instance, Field field) throws Exception {
return ((FieldAccessor) getFieldAccessor.invoke(field, instance)).get(instance);
}
public static void set(Object instance, Field field, Object value) throws Exception {
((FieldAccessor) getFieldAccessor.invoke(field, instance)).set(instance, value);
}
static {
try {
// These are used to access the direct Field instances instead of the copies you normally get through #getDeclaredFields.
privateGetDeclaredFields = Class.class.getDeclaredMethod("privateGetDeclaredFields", boolean.class);
privateGetDeclaredFields.setAccessible(true);
getFieldAccessor = Field.class.getDeclaredMethod("getFieldAccessor", Object.class);
getFieldAccessor.setAccessible(true);
} catch (Exception e) {
// Should only occur if the internals change.
e.printStackTrace();
}
}
}
Actualización : esta implementación es para Java 8, las versiones futuras cambian el backend que rompe esto. El mismo concepto todavía se aplica aunque realmente desee continuar con esta estrategia.