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);其实还可以提示反射的效率.
本文探讨了Java中field.setAccessible(true)的方法,它允许访问private变量的值。通过示例代码展示了设置为true和false时的不同效果:true可获取变量名和值,而false仅能获取变量名,尝试获取值会引发IllegalAccessException。此外,还提到setAccessible(true)对提升反射效率的影响。
2210

被折叠的 条评论
为什么被折叠?



