将java.lang.reflect.Field的accessible设为true是否会影响对象其他使用场景?
反射设置Field的accessible为true是否会影响对象其他场景的使用?
答案是不会影响对象本身在其他场景的正常使用,原因如下:
修改的是Field对象的属性,而非目标实例:
accessible是java.lang.reflect.Field类的实例属性,你修改的是通过反射拿到的这个Field对象的访问权限,目标对象(比如代码里的m)的字段在语法层面的访问限制(比如private)并没有被改变。其他地方直接通过代码调用该字段(比如m.privateField)还是会编译报错,语法层面的访问控制依然生效。仅影响当前Field对象的反射操作:这个设置只对当前你正在操作的这个Field实例有效。如果后续其他代码再通过
MyClass.class.getDeclaredField("xxx")获取同一个字段的Field对象,默认还是处于不可访问的状态,需要重新设置accessible才能用反射操作。可选:操作后恢复原状态更严谨:如果担心后续有其他反射操作用到同一个Field对象,可以在获取字段值后把
accessible改回原来的状态,避免意外影响。改进后的代码如下:
Field[] fields = MyClass.class.getDeclaredFields(); for(Field field : fields) { try { // 保存原访问状态 boolean originalAccess = field.isAccessible(); field.setAccessible(true); Object obj = field.get(m); System.out.println("Object: " + obj); // 恢复原状态 field.setAccessible(originalAccess); } catch (Exception e) { System.out.println("Illegal Access Exception : " + e); } }
哪怕不恢复原状态,也不会影响目标对象在非反射场景下的正常使用,毕竟语法层面的访问限制没被打破。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

