Как указано на других плакатах, setAccessible
это применимо только к этому экземпляру вашего java.lang.reflect.Field
, поэтому возвращать доступность в исходное состояние не требуется.
Тем не мение...
Если вы хотите, чтобы ваши вызовы field.setAccessible(true)
были постоянными, вам необходимо использовать базовые методы в java.lang.Class
и java.lang.reflect.Field
. Общественность облицовочных методов отправить вам копию этого Field
экземпляра, так что «забывает» после того, как каждый раз , когда вы делаете что - то вродеclass.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();
}
}
}
Обновление : эта реализация предназначена для Java 8, будущие версии изменят бэкэнд, который нарушит это. Та же концепция по-прежнему применяется, если вы действительно хотите продолжить эту стратегию.