標籤:
Java 反射調用私人域和方法(setAccessible)
@author ixenos
AccessibleObject類
Method、Field和Constructor類共同繼承了AccessibleObject類,該基類有兩個setAccessible方法能在運行時壓制Java語言存取控制檢查(Java language access control checks),從而能任意調用被私人化保護的方法、域和構造方法
public class AccessibleObjectextends Objectimplements AnnotatedElement
AccessibleObject 類是 Field、Method 和 Constructor 對象的基類。它提供了將反射的對象標記為在使用時取消預設 Java 語言存取控制檢查的能力。對於公用成員、預設(打包)訪問成員、受保護的成員和私人成員,在分別使用 Field、Method 或 Constructor 對象來設定或擷取欄位、調用方法,或者建立和初始化類的新執行個體的時候,會執行訪問檢查。
在反射對象中設定 accessible 標誌允許具有足夠特權的複雜應用程式(比如 Java Object Serialization 或其他持久性機制)以某種通常禁止使用的方式來操作對象。
兩個setAccessible方法設定存取權限
static void |
setAccessible(AccessibleObject[] array, boolean flag) 使用單一安全性檢查(為了提高效率)為一組對象設定 accessible 標誌的便捷方法。 |
void |
setAccessible(boolean flag) 將此對象的 accessible 標誌設定為指示的布爾值。 |
setAccessible
public static void setAccessible(AccessibleObject[] array, boolean flag) throws SecurityException
-
使用單一安全性檢查(為了提高效率)為一組對象設定 accessible 標誌的便捷方法。
首先,如果存在安全管理器,則在 ReflectPermission("suppressAccessChecks") 許可權下調用 checkPermission 方法。
如果 flag 為 true,但是不能更改輸入 array 的任何元素的可訪問性(例如,如果元素對象是 Class 類的 Constructor 對象),則會引發 SecurityException。如果發生 SecurityException,對於少於(不包括)發生異常的元素的數組元素,可以將對象的可訪問性設定為 flag;對於超出(包括)引發異常的元素的那些元素,則不更改其可訪問性。
-
-
-
參數:
-
array - AccessibleObjects 的數組
-
flag - 每個對象中的 accessible 標誌的新值
-
拋出:
-
SecurityException - 如果請求被拒絕。
-
另請參見:
-
SecurityManager.checkPermission(java.security.Permission),
RuntimePermission
setAccessible
public void setAccessible(boolean flag) throws SecurityException
-
將此對象的 accessible 標誌設定為指示的布爾值。值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。
首先,如果存在安全管理器,則在 ReflectPermission("suppressAccessChecks") 許可權下調用 checkPermission 方法。
如果 flag 為 true,並且不能更改此對象的可訪問性(例如,如果此元素對象是 Class 類的 Constructor 對象),則會引發 SecurityException。
如果此對象是 java.lang.Class 類的 Constructor 對象,並且 flag 為 true,則會引發 SecurityException。
-
-
-
參數:
-
flag - accessible 標誌的新值
-
拋出:
-
SecurityException - 如果請求被拒絕。
-
另請參見:
-
SecurityManager.checkPermission(java.security.Permission),
RuntimePermission
Java 反射調用私人域和方法(setAccessible)