2013-09-04 2 views
0

Какое влияние имеет 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] 
+0

Каковы ваши выводы? –

+0

i УГАДАЙ, он ничего не делает. но я не уверен! вот почему я задаю вопрос. –

+0

Я имел в виду: каковы ваши наблюдения после запуска вашей программы? –

ответ

6

Согласно документации AccessibleObject#setAccessible(boolean) метода:

Значение false указывает, что отраженный объект должен обеспечивать проверку доступа к языку Java.

Таким образом, установка значения false не означает, что поле не будет доступно. Это просто означает, что нормальные правила доступа Java будут соблюдаться.

Таким образом, у public участников будет доступ, как это делается в обычном режиме. То же самое для protected участников (они будут доступны в том же пакете и подклассе в другой упаковке).

+0

вот оно! я был слепой ;-) –

+0

@PhilippSander. Нет проблем :) –

+0

и нет другого побочного эффекта? –