反射setAccessible()方法

使用反射机制setAccessible方法设置字段是否可以访问,使用反射机制可以打破封装性,导致了java对象的属性不安全。  


​setAccessible()方法​


  1. //打破封装  
  2.     idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  



java代码中,常常将一个类的成员变量置为private


在类的外面获取此类的私有成员变量的value时,需要注意:


测试类:

Java代码  ​反射setAccessible()方法_成员变量


  1. public class AccessibleTest {  

  2.     private int id;  
  3.     private String name;  

  4.     public AccessibleTest() {  

  5.     }  

  6.     public int getId() {  
  7.         return id;  
  8.     }  

  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  

  12.     public String getName() {  
  13.         return name;  
  14.     }  

  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  

  18. }  



Main类:

Java代码  ​反射setAccessible()方法_成员变量


  1. public class Main {  

  2.     public static void main(String[] args) throws Exception {  
  3.         Class clazz = Class.forName("com.test.accessible.AccessibleTest");  
  4.         AccessibleTest at = new AccessibleTest();  
  5.         at.setId(1);  
  6.         at.setName("AT");  
  7.         for (Field f : clazz.getDeclaredFields()) {  
  8.             f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作  
  9.             System.out.println(f.get(at));//获取当前对象中当前Field的value  
  10.         }  

  11.     }  

  12. }  


如果没有在获取Field之前调用setAccessible(true)方法,异常:

Java代码  ​反射setAccessible()方法_成员变量


  1.  java.lang.IllegalAccessException:  
  2. Class com.test.accessible.Main   
  3. can not access   
  4. a member of class com.test.accessible.AccessibleTest  
  5. with modifiers "private"  


当然在AccessibleTest类的内部(AccessibleTest的内部类除外)

进行如上操作则不需要调用setAccesible()方法