一、field.setAccessible()方法:
setAccessible方法是干什么用的呢让我们来看一段代码吧:
public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
import java.lang.reflect.Field; public class Demo { public static void main(String[] args) throws Exception { Class clazz = User.class; User u = new User("小明"); for(Field field: clazz.getDeclaredFields()){ System.out.println(field.isAccessible()); //这里的结果是false field.setAccessible(true); System.out.println(field.getName() + ":" + field.get(u)); } } }
通过运行以上代码,我们发现 System.out.println(f.isAccessible())这一句打印结果是"false",从字面上理解是说该字段不能被访问
如果不写field.setAccessible(true);会抛出异常;
经过检查发现getName()这个方法并不抛异常,也就是是就算没有加f.setAccessible(true);也可以获得name,抛异常的是f.get(u);这句话
结论:当isAccessible()的结果是false时不允许通过反射访问该字段
当该字段时private修饰时isAccessible()得到的值是false,必须要改成true才可以访问
所以 f.setAccessible(true);得作用就是让我们在用反射时访问私有变量
上面最后的打印:
false name:小明
二、
------------