天天看點

反射setAccessible()方法反射setAccessible()方法

java代碼中,常常将一個類的成員變量置為private

在類的外面擷取此類的私有成員變量的value時,需要注意:

測試類:

反射setAccessible()方法反射setAccessible()方法
反射setAccessible()方法反射setAccessible()方法

Main類:

反射setAccessible()方法反射setAccessible()方法
反射setAccessible()方法反射setAccessible()方法

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這個屬性的值