Diğer posterlerin de belirttiği gibi setAccessible, yalnızca sizinjava.lang.reflect.Field , bu nedenle erişilebilirliği orijinal durumuna geri getirmek gerekli değildir.
Ancak...
Aramalarınızın field.setAccessible(true)kalıcı olmasını istiyorsanız, java.lang.Classve içindeki temel yöntemleri kullanmanız gerekir java.lang.reflect.Field. Yöntemleri bakan halk size göndermek kopyaları arasında Field, bu nedenle örneğin "unutur" Eğer böyle bir şey yapmak her zaman sonraclass.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();
}
}
}
Güncelleme : Bu uygulama Java 8 içindir, gelecekteki sürümler bunu bozan arka ucu değiştirir. Bu stratejiye gerçekten devam etmek istiyorsanız, aynı kavram hala geçerlidir.