java - field.setAccessible(false) effect on NON-private fields -


what effect has field.setaccessible(false) on non-private fields?

i expected access member denied, that's not case!

i tried dig in source-code, @ point (field#getfieldaccessor(object)) lost track of happening.

i created special class situation:

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();  } 

and created demo:

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)");         (field field : object.getclass().getdeclaredfields()) {             field.setaccessible(false);             try {                 system.out.println(field.getname() + ": " + field.get(object));                 // throws exception privatemember , privatefinalmember             } catch (exception e) {                 e.printstacktrace();             }          }          system.out.println("'reflective' member access after field.setaccessible(true)");         (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();             }          }      }  } 

output:

'reflective' member access after field.setaccessible(false) publicmember: java.lang.object@e9bfee2 protectedmember: java.lang.object@237aaeec defaultmember: java.lang.object@4b721a26 java.lang.illegalaccessexception: class mymain can not access member of class demoobject modifiers "private"     @ sun.reflect.reflection.ensurememberaccess(unknown source)     @ java.lang.reflect.accessibleobject.slowcheckmemberaccess(unknown source)     @ java.lang.reflect.accessibleobject.checkaccess(unknown source)     @ java.lang.reflect.field.dosecuritycheck(unknown source)     @ java.lang.reflect.field.getfieldaccessor(unknown source)     @ java.lang.reflect.field.get(unknown source)     @ mymain.main(mymain.java:13) publicfinalmember: java.lang.object@7c30cd64 protectedfinalmember: java.lang.object@67fc9fee defaultfinalmember: java.lang.object@7a67f797 java.lang.illegalaccessexception: class mymain can not access member of class demoobject modifiers "private final"     @ sun.reflect.reflection.ensurememberaccess(unknown source)     @ java.lang.reflect.accessibleobject.slowcheckmemberaccess(unknown source)     @ java.lang.reflect.accessibleobject.checkaccess(unknown source)     @ java.lang.reflect.field.dosecuritycheck(unknown source)     @ java.lang.reflect.field.getfieldaccessor(unknown source)     @ java.lang.reflect.field.get(unknown source)     @ mymain.main(mymain.java:13) 'reflective' member access after field.setaccessible(true) publicmember: java.lang.object@e9bfee2 protectedmember: java.lang.object@237aaeec defaultmember: java.lang.object@4b721a26 privatemember: java.lang.object@424c2849 publicfinalmember: java.lang.object@7c30cd64 protectedfinalmember: java.lang.object@67fc9fee defaultfinalmember: java.lang.object@7a67f797 privatefinalmember: java.lang.object@15e8f2a0 

as per documentation of accessibleobject#setaccessible(boolean) method:

a value of false indicates reflected object should enforce java language access checks.

so, setting false value doesn't mean field won't accessible. means normal java access rules enforced.

so, public members accessed done normally. same protected members (they accessible in same package, , subclass in other package).


Comments

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -