Java代碼中,常常將一個類的成員變數置為private
在類的外面擷取此類的私人成員變數的value時,需要注意:
測試類別: public class AccessibleTest { private int id; private String name; public AccessibleTest() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Main類: Java代碼 public class Main { public static void main(String[] args) throws Exception { Class clazz = Class.forName("com.test.accessible.AccessibleTest"); AccessibleTest at = new AccessibleTest(); at.setId(1); at.setName("AT"); for (Field f : clazz.getDeclaredFields()) { f.setAccessible(true);//AccessibleTest類中的成員變數為private,故必須進行此操作 System.out.println(f.get(at));//擷取當前對象中當前Field的value } } }
如果沒有在擷取Field之前調用setAccessible(true)方法,異常: Java代碼 java.lang.IllegalAccessException: Class com.test.accessible.Main can not access a member of class com.test.accessible.AccessibleTest with modifiers "private"
當然在AccessibleTest類的內部(AccessibleTest的內部類除外)
進行如上操作則不需要調用setAccesible()方法
明顯 Accessible並不是標識方法能否訪問的. public的方法 Accessible仍為false
使用了method.setAccessible(true)後 效能有了20倍的提升
Accessable屬性是繼承自AccessibleObject 類. 功能是啟用或禁用安全檢查
JDK API中的解釋
引用
AccessibleObject 類是 Field、Method 和 Constructor 對象的基類。它提供了將反射的對象標記為在使用時取消預設 Java 語言存取控制檢查的能力。對於公用成員、預設(打包)訪問成員、受保護的成員和私人成員,在分別使用 Field、Method 或 Constructor 對象來設定或獲得欄位、調用方法,或者建立和初始化類的新執行個體的時候,會執行訪問檢查。
在反射對象中設定 accessible 標誌允許具有足夠特權的複雜應用程式(比如 Java Object Serialization 或