field.setAccessible(true) 设置可以访问private变量的变量值
下面代码演示:
1.当设置 f.setAccessible(true);
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;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
Class clazz = User.class;
User u = new User("小明");
for (Field f : clazz.getDeclaredFields()) {
System.out.println(f.isAccessible());//这里的结果是false
f.setAccessible(true);
System.out.println(f.getName());
System.out.println(f.get(u));
}
}
}
运行结果:
f.setAccessible(true); 可以获取变量名 和 变量的值
false
name
小明
Process finished with exit code 0
2.当设置 f.setAccessible(false);
public class Demo {
public static void main(String[] args) throws Exception {
Class clazz = User.class;
User u = new User("小明");
for (Field f : clazz.getDeclaredFields()) {
System.out.println(f.isAccessible());//这里的结果是false
f.setAccessible(false);
System.out.println(f.getName());
System.out.println(f.get(u));
}
}
}
运行结果:
f.setAccessible(false); 可以获取变量名, 但是变量的值获取就抛IllegalAccessException异常了, 抛异常的代码: System.out.println(f.get(u));
false
name
Exception in thread "main" java.lang.IllegalAccessException: Class com.sndn.jdk18_test.Demo can not access a member of class com.sndn.jdk18_test.User with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Field.get(Field.java:390)
at com.sndn.jdk18_test.Demo.main(Demo.java:13)
Process finished with exit code 1
结论:
- f.setAccessible(true); 可以获取变量名 和 变量的值.
- f.setAccessible(false); 可以获取变量名, 但是变量的值获取就抛IllegalAccessException异常.
- f.setAccessible(true);其实还可以提示反射的效率.