反射來更改訪問權限
通過反射來更改訪問權限
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的值);
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的值);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.