Какое влияние имеет field.setAccessible(false)
на неличных полях?field.setAccessible (false) effect on NON-private fields
Я ожидал, что доступ к этому члену будет отклонен, но это не тот случай!
Я попытался копать исходный код, но в какой-то момент (Field#getFieldAccessor(Object)) я потерял информацию о том, что происходит.
Я создал специальный класс для этой ситуации:
public class DemoObject {
public Object publicMember = new Object();
protected Object protectedMember = new Object();
Object defaultMember = new Object();
private Object privateMember = new Object();
public final Object publicfinalMember = new Object();
protected final Object protectedfinalMember = new Object();
final Object defaultfinalMember = new Object();
private final Object privatefinalMember = new Object();
}
И создал демо:
import java.lang.reflect.Field;
public class MyMain {
public static void main(final String[] args) {
DemoObject object = new DemoObject();
System.out.println("'reflective' member access after field.setAccessible(false)");
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(false);
try {
System.out.println(field.getName() + ": " + field.get(object));
// only throws exception for the privateMember and privatefinalMember
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("'reflective' member access after field.setAccessible(true)");
for (Field field : object.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
System.out.println(field.getName() + ": " + field.get(object));
// throws no exception
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Выход:
'reflective' member access after field.setAccessible(false)
publicMember: [email protected]
protectedMember: [email protected]
defaultMember: [email protected]
java.lang.IllegalAccessException: Class MyMain can not access a member of class DemoObject with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at MyMain.main(MyMain.java:13)
publicfinalMember: [email protected]
protectedfinalMember: [email protected]
defaultfinalMember: [email protected]
java.lang.IllegalAccessException: Class MyMain can not access a member of class DemoObject with modifiers "private final"
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
at java.lang.reflect.Field.doSecurityCheck(Unknown Source)
at java.lang.reflect.Field.getFieldAccessor(Unknown Source)
at java.lang.reflect.Field.get(Unknown Source)
at MyMain.main(MyMain.java:13)
'reflective' member access after field.setAccessible(true)
publicMember: [email protected]
protectedMember: [email protected]
defaultMember: [email protected]
privateMember: [email protected]
publicfinalMember: [email protected]
protectedfinalMember: [email protected]
defaultfinalMember: [email protected]
privatefinalMember: [email protected]
Каковы ваши выводы? –
i УГАДАЙ, он ничего не делает. но я не уверен! вот почему я задаю вопрос. –
Я имел в виду: каковы ваши наблюдения после запуска вашей программы? –