java代碼中,常常将一個類的成員變量置為private
在類的外面擷取此類的私有成員變量的value時,需要注意:
測試類:


Main類:


console:
如果沒有在擷取Field之前調用setAccessible(true)方法,異常:
當然在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 或其他持久性機制)以某種通常禁止使用的方式來操作對象。
setAccessible
public void setAccessible(boolean flag)
throws SecurityException
将此對象的 accessible 标志設定為訓示的布爾值。值為 true 則訓示反射的對象在使用時應該取消 Java 語言通路檢查。值為 false 則訓示反射的對象應該實施 Java 語言通路檢查。
實際上setAccessible是啟用和禁用通路安全檢查的開關,并不是為true就能通路為false就不能通路
Field類的get()方法:
field.get(obj):
表示的含義是:
field是obj對象中的一個屬性(字段),get方法的傳回值值obj對象中field這個屬性的值