在Java中可以通过反射进行获取实体类中的字段值,当未设置Field的setAccessible方法为true时,会在调用的时候进行访问安全检查,会抛出IllegalAccessException异常
这是JDK手册的中文说明:
那么,解决方案就是设置Field对象的Accessible的访问标志位为Ture,就可以通过反射获取私有变量的值,在访问时会忽略访问修饰符的检查,附上例子一枚。
1 public class MyTest3 { 2 3 4 public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 5 Student student = new Student(); 6 Field field = student.getClass().getDeclaredField("name"); 7 field.setAccessible(true); 8 System.out.println(field); 9 Object object = field.get(student); 10 System.out.println(object); 11 } 12 13 14 15 } 16 17 18 class Student{ 19 20 private String name; 21 22 private Integer age; 23 24 private String sex; 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public Integer getAge() { 35 return age; 36 } 37 38 public void setAge(Integer age) { 39 this.age = age; 40 } 41 42 public String getSex() { 43 return sex; 44 } 45 46 public void setSex(String sex) { 47 this.sex = sex; 48 } 49 50 }
末尾补充下,Field类还有个静态方法,可以一次性设置多个Field字段为指定的值。
中文JDK的说明
第一个参数 array ,就是要设置flag标志位的Field对象的数组
第二个参数 flag ,将array数组的所有Field对象设置为flag标识符的新值
*******************Method和Field的Accessible的用法一致*******************