反射來更改訪問權限

通過反射來更改訪問權限

2007-09-14 21:47:11| 分類: 默認分類 |字號 訂閱

利用反射中的AccessibleObject我們可以更改,方法或屬性的訪問權限。

該類是Constructor, Field, Method的超類。

public class AccessibleObject extends Object implements AnnotatedElement

AccessibleObject 類是 Field、Method 和 Constructor 對象的基類。它提供了將反射的對象標記爲在使用時取消默認 Java 語言訪問控制檢查的能力。對於公共成員、默認(打包)訪問成員、受保護成員和私有成員,在分別使用 Field、Method 或 Constructor 對象來設置或獲取字段、調用方法,或者創建和初始化類的新實例的時候,會執行訪問檢查。

在反射對象中設置 accessible 標誌允許具有足夠特權的複雜應用程序(比如 Java Object Serialization 或其他持久性機制)以某種通常禁止使用的方式來操作對象。

public final class ReflectPermission extends BasicPermission

反射操作的 Permission 類。ReflectPermission 是一種指定權限,沒有動作。當前定義的唯一名稱是 suppressAccessChecks,它允許取消由反射對象在其使用點上執行的標準 Java 語言訪問檢查 - 對於 public、default(包)訪問、protected、private 成員。

Method對象中的invoke方法:

public Object invoke(Object obj, Object... args)

throws IllegalAccessException,

IllegalArgumentException,

InvocationTargetException

對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。個別參數被自動解包,以便與基本形參相匹配,基本參數和引用參數都隨需服從方法調用轉換。

如果底層方法是靜態的,那麼可以忽略指定的 obj 參數。該參數可以爲 null。

如果底層方法所需的形參數爲 0,則所提供的 args 數組長度可以爲 0 或 null。

如果底層方法是實例方法,則使用動態方法查找來調用它,這一點記錄在 Java Language Specification, Second Edition 的第 15.12.4.4 節中;在發生基於目標對象的運行時類型的重寫時更應該這樣做。

如果底層方法是靜態的,並且尚未初始化聲明此方法的類,則會將其初始化。

如果方法正常完成,則將該方法返回的值返回給調用者;如果該值爲基本類型,則首先適當地將其包裝在對象中。但是,如果該值的類型爲一組基本類型,則數組元素不 被包裝在對象中;換句話說,將返回基本類型的數組。如果底層方法返回類型爲 void,則該調用返回 null。

參數:

obj - 從中調用底層方法的對象

args - 用於方法調用的參數

返回:

使用參數 args 在 obj 上指派該對象所表示方法的結果

拋出:

IllegalAccessException - 如果此 Method 對象強制執行 Java 語言訪問控制,並且底層方法是不可訪問的。

IllegalArgumentException - 如果該方法是實例方法,且指定對象參數不是聲明底層方法的類或接口(或其中的子類或實現程序)的實例;如果實參和形參的數量不相同;如果基本參數的解包轉換失敗;如果在解包後,無法通過方法調用轉換將參數值轉換爲相應的形參類型。

InvocationTargetException - 如果底層方法拋出異常。

NullPointerException - 如果指定對象爲 null,且該方法是一個實例方法。

ExceptionInInitializerError - 如果由此方法引起的初始化失敗。

ClassName a = new ClassName();

Class c = ClassName.class;

Method method = c.getDeclaredMethod();

method.setAccessible(true);

method.invoke(a, method的參數);

Field field = c.getDeclaredField();

field.setAccessible(trur);

field.setInt(a,要設置的field的值);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章