一、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:小明
二、
------------